sok ember dolgozik Oracle database, SCN (System Change Number) egy olyan téma, amely érdekli őket nagyban – de annak ellenére, hogy ez egy érdekes téma, ez zavaró is. Ebben a cikkben megismerjük az SCN apróságait: mi az, hol használják, és hogyan működik.
érdemes megemlíteni, hogy ez nem lehet teljes körű lefedettség az SCN minden részletére. Ezzel azt mondta, kezdjük.
SCN-miért van szükségünk rá?
tegyük fel, hogy ez a hónap vége és a fizetés napja. Ön a bérszámfejtési csoportban van, és megfelelő felhatalmazással lekérdezést adott ki az összes alkalmazott jelenlegi bérszámfejtésének lekérésére. Számok áramlanak a képernyőn, minden remekül megy.
tegyük fel, hogy a kimenet megtekintése közben egy kolléga új fizetési futást indít, és ez a kötegelt feladat törli az aktuális számítási összefoglalót. A dolgok minden bizonnyal zavarossá válnak, ha a kimenet hirtelen ‘0’ – t mutat az új sorok megjelenésekor.
valójában ebben a forgatókönyvben valószínűleg azt várná, hogy a kimenet tükrözze az adatbázis állapotát – az egyes sorok tartalmát–, ahogyan a lekérdezés kiadásának pillanatában létezett.
az Oracle adatbázis egyik garanciája, hogy “nincsenek piszkos felhasználói adatok”. Ha szükséges, az Oracle minden sort stabil állapotba épít, abban az időben, amikor a lekérdezést kiadták.
az Oracle szépen és nagyon pontosan végzi a saját “időzítőjén” keresztül, amelyet Rendszerváltási számnak, más néven SCN-nek hívnak.
megvitatjuk az SCN ezen aspektusait:
- maga a szám
- a számgenerátor
- helyek, ahol a számot tárolják
Tehát kezdjük!
építőelemek az SCN megértéséhez
az SCN vizsgálatához több kifejezést kell érteni. Bár ezek a definíciók jól dokumentáltak, érdemes megismételni őket itt:
tranzakció
az Oracle online dokumentáció fogalmainak útmutatójából:
“a tranzakció egy logikai, atomi munkaegység, amely egy vagy több SQL utasítást tartalmaz. A tranzakció csoportosítja az SQL utasításokat úgy, hogy azok mind elkötelezettek legyenek, ami azt jelenti, hogy alkalmazzák őket az adatbázisra, vagy az összes visszagörgetésre kerülnek, ami azt jelenti, hogy visszavonják őket az adatbázisból. Az Oracle Database minden tranzakcióhoz egyedi azonosítót rendel, amelyet tranzakciós azonosítónak hívnak”.
egyszerűbben: amikor elindítunk egy tranzakciót, változtatásokat kezdeményezünk. Ezeket vagy teljes egészében, vagy egyáltalán nem kell kitölteni. Mivel a tranzakciók az adatbázisban fordulnak elő, a megváltozott területeket olvasó felhasználókat nem érintheti semmilyen mellékhatás, amely megváltoztathatja eredményeiket.
ahhoz, hogy a tranzakciók megfelelően működjenek bármely adatbázisban, négy ACID szabályt kell követnie az adatbázisnak. Ezek a következők:
- Atomicitás;
- konzisztencia;
- izolálás;
- tartósság.
tehát hol illeszkedik az SCN mindehhez? A válasz erre a kérdésre az, hogy az SCN használata csak az Oracle fenntartja az adatok konzisztenciáját. Ez annak biztosítására szolgál, hogy bármely időpontban ne legyen eltérés az eredményekben, amelyeket a többiek mutatnak, amikor az egyik felhasználó megváltoztat valamit, és fordítva.
összefoglalva, az Oracle-ben az “az olvasók nem várnak az írókra és az íróknak nincs szükségük az olvasókra” elvét teljes mértékben és valóban követik. Ennek érdekében rendkívül fontos, hogy az adatok, amelyek jelenleg bármilyen változáson mennek keresztül, senki számára ne legyenek elérhetők, kivéve azt a személyt, aki ezeket a változtatásokat végrehajtja. A tranzakciók esetében ez szükséges az adatok integritásának fenntartásához. Három dolog fordulhat elő, ami megzavarhatja ezt az integritást-Piszkos olvasás, Fuzzy olvasás és Fantomolvasás. Annak biztosítása érdekében, hogy ezekben a tranzakciókban ne legyenek integritási problémák, különböző szintű izolációk állnak rendelkezésre. Ezek a következők:
- Read Uncommitted
- read Committed
- Repeatable Read
- Serializable
tranzakciós elkülönítési szintek
ezek közül az Oracle a Read Committed szolgáltatást kínálja alapértelmezett elkülönítési szintként, ügyelve arra, hogy a felhasználó ne láthassa egy másik felhasználó által végrehajtott, még el nem követett módosításokat. A “piszkos” jelzéssel ellátott adatokat nem szabad olvasni, és olyan mechanizmusnak kell lennie, amely elég erős ahhoz, hogy mindezt lehetővé tegye.
ennek lehetővé tételéhez az SCN létfontosságú szerepet játszik.
SCN, An Introduction
rendszer Commit szám lehet érteni, mint az Oracle ábrázolása az idő. Az Oracle az SCN-t használja a konzisztencia szabályozására, a helyreállítás végrehajtására és a változtatási Vektorok megrendelésére a redo-ban.
az SCN számos helyen megtalálható – mind a memóriában, mind a lemezen. Különböző helyeket használnak az adatbázis-rendszer azonosítására az adatbázis különböző állapotai. Például egyes helyeken a tranzakció teljesítési állapotának, valamint az aktív vagy elkötelezett állapotának jelölésére szolgál.
a közhiedelemmel ellentétben, nem kap generált csak abban az időben elkövetni, bár ez az, amit a neve is sugallja. Az SCN állandóan ott van az adatbázisban, ami az adott pillanatban zajló művelet időbeli részét képviseli. Ez nem teljesen pontatlan azt mondani, hogy SCN nem kap generált egy elkövetni, ez – de ez nem az egyetlen módja SCN keletkezik.
az SCN egy kétrészes szám, amelyet kérésre generálnak egy eseményre válaszul. Ez némileg olyan, mint a naptár és az óra kombinációjából származó dátum és idő; az óra gyorsan változik, és csak akkor változik meg a túlcsordulás – a naptár–, amikor átment a teljes 24 órás cikluson. Az órát megváltoztató esemény azonban az inga, és szabályos, míg az SCN-t megváltoztató esemény egy adott belső funkció hívása.
a Naptár/Óra időbélyegéhez hasonlóan az érték különféle helyeken rögzíthető, mindegyik más-más felhasználásra.
az SCN-hez hasonló valós példa egy repülőtéri óra. Két ember egyszerre lép be egy repülőtérre, és feljegyezheti az óra idejét. Ez a pillanat ad nekünk egy belépési SCN-t, amely történetesen ugyanaz mindkét ember számára. Az egyik személy kap egy kocsit a poggyászhoz a bejelentkezés előtt, míg a másik közvetlenül a check-in pulthoz jut. Az ülések kiosztásakor minden személy eltérő ‘check-in SCN’ – t kaphat, mivel az idők kissé eltérnek. Egy ‘ beszállási SCN ‘rendelhető annak jelzésére, hogy mikor szálltak fel, de mindkettő ugyanazt a’felszállási SCN’ -t kapja.
a naptár és az óra kombinációjához hasonlóan az SCN garantáltan növekszik normál működés közben. Nincs garancia arra, hogy a szám szekvenciális lesz (hiányzó számok).
tehát hol használják az SCN-ről szóló információkat az Oracle adatbázisban? Nos, szinte mindenhol. Ahogy az időt minden tevékenységünkhöz társítjuk, az SCN az adatbázis funkcionalitásának minden részéhez is társul. Például, amikor megpróbál adatokat kiválasztani egy táblázatból, az SCN segítségével megerősíti, hogy az adatok konzisztensek-e vagy sem. Az SCN megtalálható az adatblokk tranzakciós fejlécében is. Ez az SCN azt az időpontot jelöli, amikor a tranzakció elkezdődött, és amikor azt végrehajtották. Hasonlóképpen, minden végrehajtott módosításnál egy bejegyzés marad fenn a redo naplóban, és minden ilyen bejegyzésnél az SCN a tranzakció előfordulásának idejét jelöli.
olvasási konzisztencia az SCN segítségével dönti el, hogy mennyi ideig kell alkalmaznia a visszavonást a piszkos puffer felett, hogy a munkamenet olvasási konzisztens adatkérése teljesíthető legyen. Mint ismeretes, az SCN minden commit művelettel növekszik.
SCN formátum és szerkezet
az SCN egy hatalmas szám, amelynek két összetevője van: SCN alap & SCB Wrap.
az SCN egy 6 bájtos (48 bites) szám. Ebből a 48 bitből az SCN_WRAP egy 16 bites (2 bájtos) szám, az SCN_BASE pedig egy 32 bites (4 bájtos) szám. Mindkét alap & WRAP az SCN növekményének szabályozására és annak biztosítására szolgál, hogy az adatbázis ne fogyjon ki belőle. Az SCN_WRAP értéke 1-gyel növekszik, amikor az SCN_BASE eléri a 4 milliárd értéket és az SCN_BASE értéke 0 lesz.
az Oracle 12c verziójából az SCN szám 8 bájtos szám.
tehát hogyan látjuk az aktuális SCN értéket? A legegyszerűbb módszer a view V$adatbázis lekérdezése. Nézd meg:
1
2
3
4
5
|
SQL> válassza ki a current_scn-t a v$adatbázisból;
CURRENT_SCN
———–
1123790
|
mint láthatjuk, hogy az SCN számként jelenik meg. Ez azért jó, mert megkönnyíti számunkra az SCN használatát a helyreállítást, visszaemlékezést stb. Ha akarjuk, az SCN-t hexadecimális értékre is konvertálhatjuk:
1
2
3
4
5
|
SQL> válassza ki a to_char (‘1123790’, ‘xxxxxxxx’) scn_hex-et a dual – ból;
SCN_HEX
———
1125c
|
Íme egy példa a kimenet ugyanabból a nézetből elérhető párszor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> válassza ki a current_scn-t a v$adatbázisból;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886
|
érdekes módon az SCN értékének ez a növekedése az SCN fontos szempontját mutatja. Láthatjuk, hogy minden végrehajtással növekszik az SCN száma. A view V$adatbázis lekérdezésével valójában az SCN szám ugrását okozzuk.
SMON_SCN_TIME tábla
a legegyszerűbb módja annak, hogy mindkét érték egy belső tábla tulajdonában SYS felhasználó – SMON_SCN_TIME. A következő egy kimenet ugyanabból (11204).
1
2
3
4
5
6
|
SQL> válassza SCN_wrp, SCN_bas, SCN származó smon_SCN_time ahol rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
ez a táblázat a létrehozott SCN-ek bejegyzéseit tartalmazza. Az adatokat nagyjából 5 perces lépésekben tárolja, és 5 napnyi adatot tárol. Ez azt jelenti, hogy a táblázat körülbelül 1440 rekordot tartalmaz. A rekordok pontos száma kissé eltér, mivel a tárolási növekedés nem pontosan 5 perc.
1
2
3
4
5
|
SQL> válassza count ( * ) a SMON_SCN_TIME;
COUNT(*)
———-
1494
|
az Oracle 10g előtti verzióiban az SCN időbeli leképezése az idővel +/- 5 perc volt, de 10g – től ez + / – 3 másodpercre változik. Mivel ez egy belső táblában van tárolva, az Oracle nem engedélyezi az ebből a táblából származó információkhoz való közvetlen hozzáférést. A hozzáféréshez API-k állnak rendelkezésre. Az egyik ilyen API a dbms_flashback csomagból származik.GET_SYSTEM_CHANGE_NUMBER, amely felhasználható a sorszám eléréséhez ebből a táblázatból. Erre példa az alábbiakban található (köszönet Tom Kyte-nek a lekérdezésért):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
SQL> l
válassza SCN_to_timestamp (SCN) ts, min (SCN), max (SCN)
– tól (
válassza a dbms_flashback lehetőséget.get_system_change_number () – szintű SCN
kettős
csatlakozás szint szerint<= 100
)
csoportosítás SCN_to_timestamp (SCN)
* rendezés SCN_to_timestamp (SCN)
SQL> /
TS MIN (SCN) MAX (SCN)
————————————————————————— ———- ———-
06-Május-16 05.22.04.000000000 PM 1245323 1245323
06-Május-16 05.22.07.000000000 PM 1245324 1245324
06-Május-16 05.22.10.000000000 PM 1245325 1245325
06-MÁJUS-16 05.22.13.000000000 PM 1245326 1245326
06-MÁJUS-16 05.22.16.000000000 PM 1245327 1245327
06-MÁJUS-16 05.22.19.000000000 PM 1245328 1245328
06-MÁJUS-16 05.22.22.000000000 PM 1245329 1245329
06-MÁJUS-16 05.22.25.000000000 PM 1245330 1245330
06-MÁJUS-16 05.22.28.000000000 PM 1245331 1245331
06-MÁJUS-16 05.22.31.000000000 PM 1245332 1245332
06-MÁJUS-16 05.22.34.000000000 PM 1245333 1245333
06-MÁJUS-16 05.22.37.000000000 PM 1245334 1245334
06-Május-16 05.22.40.000000000 PM 1245335 1245335
06-Május-16 05.22.43.000000000 PM 1245336 1245336
06-Május-16 05.22.46.000000000 PM 1245337 1245337
06-Május-16 05.22.49.000000000 PM 1245338 1245338
06-Május-16 05.22.52.000000000 PM 1245339 1245339
|
hogyan tudjuk leképezni az SCN-t időbélyeggel a 10G előtti verziókban?
fontos megjegyezni, hogy ez a táblázat nem mutatja meg, miért növekedne az SCN számok növekedési üteme. Egy kis formázással elképzelhető a generált SCN-számok elképzelése, de növekedésük forrása nem lesz nyilvánvaló ebből a táblázatból.
ennek ellenőrzésének másik módja a v$LOG_HISTORY nézet. A nézet tartalmazza az SCN-t a FIRST_CHANGE# és a NEXT_CHANGE # oszlopok formájában, és ezen a két oszlopon keresztül láthatjuk az adatbázisban egy ideig generált SCN-ek mennyiségét. A ” first_change# a legalacsonyabb SCN, amely megjelenik az archivált naplófájlban a szál adott sorszámán. A” next_change# ” a legalacsonyabb SCN, amely a következő archivált naplófájlban jelenik meg.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL> válassza ki a#, first_change#,next_change # szálat a V$log_history-ból;
téma # FIRST_CHANGE # KÖVETKEZŐ_CSERE#
———- ————- ————
1 925702 958823
1 958823 959634
1 959634 972579
1 972579 993714
1 993714 1020785
1 1020785 1023738
1 1023738 1023873
1 1023873 1023995
|
a SMON_SCN_TABLE – hez hasonlóan ebben a táblázatnézetben sem lehet megtalálni az SCN-számok generálásának növekedésének forrását. Ennek ellenére használhatja ezt a nézetet egyetlen példányban, valamint RAC környezetben.
SCN növeli a szekvencia?
mostanra elég nyilvánvalónak kell lennie, hogy az SCN folyamatosan növekvő számnak tűnik. Érdekes, hogy annak ellenére, hogy ez egy szám, az Oracle nem használ semmilyen szekvenciát annak növelésére, hanem belső funkciókat használ. Például az SCN_BASE növeléséhez a belsőleg használt függvény A KCMGAS(Get and Advance SCN). Ezt a funkciót minden alkalommal meghívjuk, amikor új SCN-t kérünk, és a függvény hívása megnő. Ehhez a funkcióhoz hasonlóan a Kcmgcs (Get Current SCN) az aktuális SCN és az ahhoz használt hívás lekérésére szolgál. Ezek a függvényhívások a V$sysstat nézetből láthatók. E statisztikák leírása megtalálható a 12.1.
lássuk, hogyan kapcsolódnak ezek a hívások az SCN generációhoz. Két munkamenetet használunk itt-az egyik a hívások megtekintéséhez a nézet V$SYSSTAT nézetben, a másik pedig az SCN húzásához.
1
2
3
4
5
6
7
8
9
10
|
Session -1
SQL> l
1 * Válassza current_SCN a V$adatbázis
SQL> /
CURRENT_SCN
———–
698815
SQL>
|
ehhez az SCN-hez ezek voltak a V$sysstat értékei:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> l
1 Válassza ki a nevet, értéket a V$sysstat
2 * ahol a név, mint a ‘%hív% ‘
SQL> /
név érték
—————————————————————- ———-
hívások kcmgcs-be 427
hívások kcmgrs-be 0
hívások kcmgas-ba 7272
kéri, hogy pillanatfelvétel SCN: kcmgss 159790
SQL>
|
adjunk ki egy lekérdezést az aktuális SCN megtekintéséhez az 1. munkamenetben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SQL> l
1* select current_SCN from V$database
SQL> /
CURRENT_SCN
———–
698815
SQL> /
CURRENT_SCN
———–
698889
SQL>
|
And itt van a második ülés eredménye 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> /
név érték
—————————————————————- ———-
hívások kcmgcs-be 427
hívások kcmgrs-be 0
hívások kcmgas-ba 7272
hívások pillanatfelvétel SCN lekéréséhez: kcmgss 159790
SQL> /
név érték
—————————————————————- ———-
hívások kcmgcs 427
hívások kcmgrs 0
hívások kcmgas 7278
hívások, hogy pillanatfelvétel SCN: kcmgss 159905
SQL>
|
láthatjuk, hogy a hívások a KCMGA nőtt 7278 az utolsó érték, 7272. Mivel az Oracle nem használ sorozatot a szám növelésére, nincs garancia arra, hogy az SCN szám mindig ugyanabban a sorrendben növekszik.
következtetés
ebben a cikkben áttekintettük, hogy mi az SCN, hogyan tekinthetjük meg, és milyen követelmények vannak rá. A következő cikkben megnézzük, hogy milyen különböző típusú SCN-ek állnak rendelkezésre, és hogyan használják őket az adatbázisban. Maradjanak velünk!