Redgate Hub

pro mnoho lidí pracujících s databází Oracle je SCN (System Change Number) téma, které je velmi zajímá – ale přesto je to fascinující téma, je to také matoucí. V tomto článku se dozvíme nitty-kostrbatý SCN: co to je, kde se používá, a jak to funguje.

stojí za zmínku, že to není a nemůže být úplné pokrytí každého detailu o SCN. S tím řekl, začněme.

SCN-proč to potřebujeme?

Předpokládejme, že je konec měsíce a jeho výplata. Jste ve mzdové skupině a s příslušnou autoritou jste vydali dotaz, abyste vytáhli aktuální platový výpočet všech zaměstnanců. Čísla tečou po obrazovce, všechno jde skvěle.

Předpokládejme, že když se díváte na výstup, kolega spustí nový výplatní běh a tato dávková úloha vymaže aktuální souhrn výpočtu. Věci by se jistě staly matoucí, kdyby váš výstup náhle ukázal “ 0 “ pro nové řádky, které vycházejí.

pro tento scénář byste pravděpodobně očekávali, že výstup bude odrážet “ stav databáze – – obsah každého řádku – způsob, jakým existoval v okamžiku, kdy jste zadali svůj dotaz.

jednou ze záruk databáze Oracle je, že „neexistují žádné špinavé čtení uživatelských dat“. Pokud je to nutné, Oracle obnoví každý řádek do stabilního stavu v okamžiku, kdy byl dotaz vydán.

Oracle to dělá pěkně a velmi přesně prostřednictvím vlastního „časovače“, známého jako číslo změny systému, AKA SCN.

budeme diskutovat o těchto aspektech SCN:

  • samotné číslo
  • generátor čísel
  • místa, kde je číslo uloženo

takže začněme!

stavební bloky pro pochopení SCN

aby bylo možné zkoumat SCN, musí být pochopeno několik termínů. Ačkoli jsou tyto definice dobře zdokumentovány, stojí za to je opakovat zde:

transakce

z Průvodce koncepty Online dokumentace Oracle:

„transakce je logická, atomová jednotka práce, která obsahuje jeden nebo více příkazů SQL. Transakce seskupuje příkazy SQL tak, že jsou buď všechny odevzdány, což znamená, že jsou aplikovány na databázi, nebo všechny vráceny zpět, což znamená, že jsou vráceny z databáze. Oracle Database přiřadí každé transakci jedinečný identifikátor nazvaný ID transakce“.

jednodušeji: když zahájíme transakci, zahájíme sadu změn. Ty musí být buď dokončeny v úplnosti, nebo nesmí být dokončeny vůbec. Jak se transakce vyskytují v databázi, uživatelé, kteří čtou jakoukoli oblast, která se změnila, nesmí být ovlivněni žádnými vedlejšími účinky, které mohou změnit jejich výsledky.

aby transakce fungovaly správně v jakékoli databázi, musí databáze dodržovat čtyři pravidla kyseliny. Jedná se o:

  • Atomicita;
  • konzistence;
  • izolace;
  • trvanlivost.

tak kde se SCN vejde do toho všeho? A odpověď na tuto otázku je, že pomocí SCN pouze Oracle udržuje konzistenci dat. To se provádí tak, aby bylo zajištěno, že v každém okamžiku neexistuje žádný rozpor ve výsledcích, které jsou zobrazeny ostatním, když jeden uživatel něco mění, a naopak.

abychom to shrnuli, v Oracle je zcela a skutečně dodržován princip „čtenáři nečekají na spisovatele a spisovatelé nepotřebují čtenáře“. Za tímto účelem je nanejvýš důležité, aby údaje, které v současné době procházejí jakoukoli změnou, nesměly být k dispozici nikomu kromě osoby, která tyto změny provádí. U transakcí je to nutné k zachování integrity dat. Mohou nastat tři věci, které mohou narušit tuto integritu-špinavé čtení, Fuzzy čtení a fantomové čtení. Aby se zajistilo, že v těchto transakcích nebudou žádné problémy s integritou, jsou k dispozici různé úrovně izolací. Jedná se o:

  • Read Uncommitted
  • Read Committed
  • Repeatable Read
  • Serializable

úrovně izolace transakcí

z nich Oracle nabízí Read Committed jako výchozí úroveň izolace, čímž se ujistí, že uživatel nemůže vidět změny provedené jiným uživatelem, které dosud nebyly spáchány. Nesmí být přečtena žádná data, která jsou označena jako „špinavá“, a musí existovat mechanismus dostatečně robustní, aby to všechno bylo možné.

aby to bylo možné, hraje SCN zásadní roli.

SCN, Úvod

číslo odevzdání systému lze chápat jako reprezentaci času Oracle. Oracle používá SCN pro kontrolu konzistence, pro provádění obnovy a pro objednání vektorů změn v redo.

SCN se nachází na mnoha místech-jak v paměti, tak na disku. Různá umístění se používají k pomoci databázového systému identifikovat různé stavy databáze. Například v některých lokalitách se používá k označení stavu dokončení transakce a toho, zda je aktivní nebo odevzdaná.

na rozdíl od všeobecného přesvědčení se nevytváří pouze v době odevzdání, i když to naznačuje samotný název. SCN je tam po celou dobu v databázi, což představuje časovou část pro operaci, která se děje v tomto okamžiku. Není zcela nepřesné říci, že SCN není generován commitem – ale to není jediný způsob, jak je SCN generován.

SCN je dvoudílné číslo, které je generováno na vyžádání v reakci na událost. Je to něco jako datum a čas odvozený z kombinace kalendáře a hodin; hodiny se rychle mění a pouze tehdy, když prošly úplným 24 hodinový cyklus je přetečení-kalendář-změněno. Událost, která mění hodiny, je však „kyvadlo“ a je pravidelné, zatímco událost, která mění SCN, je volání na jednu konkrétní vnitřní funkci.

podobně jako časové razítko kalendáře/hodin může být hodnota zaznamenána na různých místech, každé pro jiné použití.

jedním z příkladů podobného SCN v reálném světě jsou letištní hodiny. Dva lidé vstupují na letiště současně a mohou si všimnout času hodin. Ten okamžik nám dává „vstupní SCN“, který je pro oba lidi stejný. Jedna osoba dostane vozík pro zavazadla před odbavením, zatímco druhá postupuje přímo k odbavovacímu pultu. Když jsou místa přidělena, každá osoba může získat jiný „check-in SCN“, protože časy se mírně liší. „Palubní SCN“ může být přiřazen k označení, kdy každý nastoupil, ale oba dostanou stejný „vzletový SCN“.

stejně jako kombinace kalendáře a hodin je zaručeno, že se SCN zvyšuje za normálního provozu. Neexistuje žádná záruka, že číslo bude sekvenční (chybějící čísla).

kde jsou tedy tyto informace o SCN použity v databázi Oracle? No, skoro všude. Stejně jako spojujeme čas s každou naší činností, SCN je také spojena s každou částí funkčnosti databáze. Například při pokusu o výběr dat z tabulky se SCN používá k potvrzení, zda jsou tato data konzistentní nebo ne. SCN se také nachází v záhlaví transakcí datového bloku. Toto SCN by představovalo čas, kdy transakce začala a kdy byla spáchána. Podobně pro každou provedenou změnu je zachována položka v protokolu opakování a pro každou z těchto položek se SCN používá k reprezentaci času výskytu transakce.

konzistence čtení používá SCN k rozhodnutí, jak dlouho musí použít zpět přes špinavou vyrovnávací paměť, aby bylo možné dokončit požadavek na konzistentní čtení pro relaci. A jak je dobře známo, SCN se zvyšuje s každou operací odevzdání.

SCN formát a struktura

SCN je obrovské číslo se dvěma složkami: SCN Base & SCB Wrap.

SCN je 6 byte (48 bitů) číslo. Z těchto 48 bitů je SCN_WRAP 16bitové (2 bajty) číslo a SCN_BASE 32bitové (4 bajty) číslo. Oba báze & WRAP se používají k řízení přírůstku SCN a k zajištění toho, že databáze nebude vyčerpána. SCN_WRAP se zvýší o 1, když SCN_BASE dosáhne hodnoty 4 miliardy a SCN_BASE se stane 0.

od Oracle verze 12c je SCN číslo 8 bajtové číslo.

jak tedy vidíme aktuální hodnotu SCN? Nejjednodušší způsob je dotaz na databázi view v$. Podívat:

1
2
3
4
5

SQL> vyberte current_scn z databáze V$;
CURRENT_SCN
———–
1123790

jak vidíme, že SCN se zobrazí jako číslo. To je dobré, protože nám usnadňuje používání SCN v našich prohlášeních provádějících obnovu, flashback atd. Pokud chceme, můžeme převést SCN na hexadecimální hodnotu:

1
2
3
4
5

SQL> vyberte to_char (‚1123790‘, ‚xxxxxxxx‘) scn_hex z dual;
SCN_HEX
———
1125

zde je příklad výstupu ze stejného pohledu přístupného několikrát:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

SQL> vyberte current_scn z databáze V$;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886

je zajímavé, že toto zvýšení hodnoty SCN ukazuje důležitý aspekt SCN. Vidíme, že při každém provedení dochází ke zvýšení počtu SCN. Dotazem na databázi view V$skutečně způsobujeme skok v čísle SCN.

tabulka SMON_SCN_TIME

nejjednodušší způsob, jak vidět obě tyto hodnoty, je z interní tabulky vlastněné uživatelem SYS-SMON_SCN_TIME. Následuje výstup ze stejného (11204).

1
2
3
4
5
6

SQL> vyberte SCN_wrp, SCN_bas, SCN z smon_SCN_time kde rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406

tato tabulka obsahuje položky vygenerovaných SCN. Ukládá data ve zhruba 5minutových krocích a drží data za 5 dní. To znamená, že tabulka obsahuje přibližně 1440 záznamů. Přesný počet záznamů se bude mírně lišit, protože přírůstek úložiště není přesně 5 minut.

1
2
3
4
5

SQL> select count(*) from SMON_SCN_TIME;
COUNT(*)
———-
1494

ve verzích Oracle před 10g bylo Časové mapování SCN s časem + / – 5 minut, ale od 10g se toto změní na + / – 3 sekundy. Protože se jedná o ukládání do interní tabulky, Oracle neumožňuje přístup k informacím z této tabulky přímo. Pro přístup k němu jsou k dispozici rozhraní API. Jeden takový API je z balíčku DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, který lze použít pro přístup k pořadovému číslu z této tabulky. Příklad toho je uveden níže (díky Tom Kyte za dotaz):

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
vyberte SCN_to_timestamp (SCN) ts, min (SCN), max (SCN)
z (
vyberte dbms_flashback.get_system_change_number () – úroveň SCN
z duálního
připojení podle úrovně <= 100
)
skupina podle SCN_to_timestamp (SCN)
* pořadí podle SCN_to_timestamp (SCN)
SQL> /
TS MIN (SCN) MAX (SCN)
————————————————————————— ———- ———-
06-květen-16 05.22.04.000000000 PM 1245323 1245323
06-květen-16 05.22.07.000000000 PM 1245324 1245324
06-května-16 05.22.10.000000000 PM 1245325 1245325
06-KVĚTEN-16 05.22.13.000000000 PM 1245326 1245326
06-KVĚTEN-16 05.22.16.000000000 PM 1245327 1245327
06-KVĚTEN-16 05.22.19.000000000 PM 1245328 1245328
06-KVĚTEN-16 05.22.22.000000000 PM 1245329 1245329
06-KVĚTEN-16 05.22.25.000000000 PM 1245330 1245330
06-KVĚTEN-16 05.22.28.000000000 PM 1245331 1245331
06-KVĚTEN-16 05.22.31.000000000 PM 1245332 1245332
06-KVĚTEN-16 05.22.34.000000000 PM 1245333 1245333
06-KVĚTEN-16 05.22.37.000000000 PM 1245334 1245334
06-květen-16 05.22.40.000000000 PM 1245335 1245335
06-květen-16 05.22.43.000000000 PM 1245336 1245336
06-květen-16 05.22.46.000000000 PM 1245337 1245337
06-květen-16 05.22.49.000000000 PM 1245338 1245338
06-květen-16 05.22.52.000000000 PM 1245339 1245339

jak můžeme mapovat SCN s časovým razítkem ve verzích před 10g?

je důležité si uvědomit, že tato tabulka neukazuje, proč by došlo ke zvýšení rychlosti nárůstu čísel SCN. S trochou formátování je možné mít představu o generovaných číslech SCN, ale zdroj jejich růstu nebude z této tabulky patrný.

další způsob, jak to zkontrolovat, je z pohledu V$LOG_HISTORY. Pohled obsahuje SCN ve formě sloupců FIRST_CHANGE# a NEXT_CHANGE# a v těchto dvou sloupcích vidíme množství SCN generovaných v databázi za určité časové období. „First_change# je nejnižší SCN, která se objeví v archivovaném souboru protokolu při daném pořadovém čísle tohoto vlákna. „Next_change#“ je nejnižší SCN, která se objeví v dalším archivovaném souboru protokolu.

1
2
3
4
5
6
7
8
9
10
11
12

SQL> vyberte vlákno#, first_change#, next_change # z V$log_history;
vlákno # FIRST_CHANGE# NEXT_CHANGE#
———- ————- ————
1 925702 958823
1 958823 959634
1 959634 972579
1 972579 993714
1 993714 1020785
1 1020785 1023738
1 1023738 1023873
1 1023873 1023995

stejně jako u SMON_SCN_TABLE není možné najít zdroj zvýšení generování čísel SCN z tohoto pohledu tabulky. Přesto můžete tento pohled použít v jediné instanci i v prostředí RAC.

SCN se zvyšuje pomocí sekvence?

nyní by mělo být zřejmé, že SCN se zdá být číslo, které se neustále zvyšuje. Zajímavé je, že i když je to číslo, Oracle nepoužívá žádnou sekvenci ke zvýšení, ale místo toho používá interní funkce. Například pro zvýšení SCN_BASE je interně použitá funkce kcmgas (Get and Advance SCN). Tato funkce se volá pokaždé, když je požadováno nové SCN a volání pro tuto funkci se zvýší. Podobně jako tato funkce, KCMGCS (Get Current SCN) se používá k získání aktuálního SCN a volání použitého pro něj. Tato volání funkcí lze vidět z pohledu v$sysstat. Popis těchto statistik naleznete v referenční příručce 12.1.

podívejme se, jak tyto hovory souvisejí s generací SCN. Používáme zde dvě relace-jednu pro zobrazení hovorů v zobrazení v$SYSSTAT a druhou pro vytažení SCN.

1
2
3
4
5
6
7
8
9
10

Session -1
SQL> l
1 * Vyberte current_SCN z databáze V$
SQL> /
CURRENT_SCN
———–
698815
SQL>

pro tento SCN to byly hodnoty pro v$sysstat:

1
2
3
4
5
6
7
8
9
10
11
12
13

SQL> l
1 Vyberte název, hodnota Z v$sysstat
2 * kde název jako ‚%volá na% ‚
SQL> /
hodnota názvu
—————————————————————- ———-
volání do kcmgcs 427
volání do kcmgrs 0
volání do kcmgas 7272
volání pro získání snapshot SCN: kcmgss 159790
SQL>

Udělejme dotaz, abychom viděli aktuální SCN v relaci 1:

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 zde je výsledek druhé relace 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SQL> /
hodnota názvu
—————————————————————- ———-
volání do kcmgcs 427
volání do kcmgrs 0
volání do kcmgas 7272
volání k získání snapshot SCN: KCMGSS 159790
SQL> /
hodnota názvu
—————————————————————- ———-
volání do kcmgcs 427
volání do kcmgrs 0
volání do kcmgas 7278
volání k získání snapshot SCN: kcmgss 159905
SQL>

vidíme, že volání na KCMGAS se zvýšila na 7278 z poslední hodnoty, 7272. Protože Oracle nepoužívá sekvenci ke zvýšení počtu, neexistuje žádná záruka, že číslo SCN bude vždy zvýšeno ve stejném pořadí.

závěr

v tomto článku jsme se podívali na to, co je SCN, jak ji zobrazit a jaké jsou požadavky na ni. V dalším článku uvidíme, jaké různé typy SCN jsou k dispozici a jak jsou používány v databázi. Zůstaňte naladěni!

Write a Comment

Vaše e-mailová adresa nebude zveřejněna.