Redgate Hub

voor veel mensen die met Oracle database werken, is SCN (System Change Number) een onderwerp dat hen zeer interesseert – maar ondanks dat het een fascinerend onderwerp is, is het ook verwarrend. In dit artikel zullen we de nitty-gritty van SCN leren: wat het is, waar het wordt gebruikt, en hoe het werkt.

het is vermeldenswaard dat dit geen volledige dekking van elk detail over SCN is en kan zijn. Dat gezegd hebbende, laten we beginnen.

SCN – Waarom hebben we het nodig?

stel dat het het einde van de maand en de betaaldag is. U bent in de Payroll groep en, met de juiste autoriteit, hebben een query om de huidige salarisberekening van alle werknemers te trekken uitgegeven. De cijfers stromen over het scherm, alles gaat geweldig.

stel dat, terwijl u naar de output kijkt, een collega een nieuwe pay run start en dat batch taak de huidige berekening samenvatting wist. Dingen zouden zeker verwarrend worden als je output plotseling ‘0’ liet zien voor de nieuwe rijen die uitkomen.

in dit scenario zou u waarschijnlijk verwachten dat de uitvoer de ‘status van de database’ – de inhoud van elke rij – weergeeft zoals deze bestond op het moment dat u uw zoekopdracht gaf.

een van de garanties van de Oracle-database is dat “er geen vuile gegevens van gebruikers worden gelezen”. Indien nodig zal Oracle elke rij opnieuw opbouwen naar de stabiele status op het moment dat de query is uitgegeven.

Oracle doet het netjes en zeer nauwkeurig door middel van een “timer” van zijn eigen, bekend als het systeem Change Number, alias SCN.

we zullen deze aspecten van het SCN bespreken:

  • het nummer zelf
  • de nummergenerator
  • plaatsen waar het nummer is opgeslagen

dus laten we beginnen!

bouwstenen voor het begrijpen van SCN

om SCN te onderzoeken, moeten verschillende termen worden begrepen. Hoewel deze definities goed gedocumenteerd zijn, is het de moeite waard ze hier te herhalen:

transactie

uit de Concepts guide of Oracle online Documentation:

“een transactie is een logische, atomaire werkeenheid die een of meer SQL-statements bevat. Een transactie groepeert SQL-statements zodat ze ofwel allemaal worden gecommit, wat betekent dat ze worden toegepast op de database, of allemaal teruggedraaid, wat betekent dat ze ongedaan worden gemaakt uit de database. Oracle Database kent elke transactie een unieke identificatie toe, een transactie-ID genaamd”.

eenvoudiger: wanneer we een transactie starten, starten we een reeks wijzigingen. Deze MOETEN in hun geheel of in het geheel niet worden ingevuld. Aangezien de transacties in de database voorkomen, mogen de gebruikers die een gebied lezen dat is veranderd, niet worden beïnvloed door bijwerkingen die hun resultaten kunnen wijzigen.

om de transacties in een databank correct te laten werken, moeten vier regels voor zuur door de databank worden gevolgd. Deze zijn:

  • atomiciteit;
  • consistentie;
  • isolatie;
  • duurzaamheid.

dus waar past SCN in dit alles? En het antwoord op die vraag is dat het gebruik van SCN alleen Oracle zorgt voor consistentie van gegevens. Dit wordt gedaan om ervoor te zorgen dat elk punt van de tijd, er is geen discrepantie in de resultaten die worden getoond aan de anderen wanneer een gebruiker iets verandert, en vice versa.

om samen te vatten, wordt in Oracle het principe van “lezers wachten niet op schrijvers en schrijvers hebben geen lezers nodig” volledig en echt gevolgd. Daartoe is het van het grootste belang dat de gegevens, die momenteel enige vorm van wijziging ondergaan, voor niemand beschikbaar mogen zijn, behalve de persoon die deze wijzigingen aanbrengt. Voor transacties is dit vereist om de integriteit van de gegevens te behouden. Er kunnen drie dingen gebeuren die deze integriteit kunnen verstoren-vies lezen, wazig lezen en Fantoomlezen. Om ervoor te zorgen dat er geen integriteitsproblemen zullen zijn in deze transacties, zijn verschillende niveaus van isolaties beschikbaar. Deze zijn:

  • Read Uncommitted
  • repeatable Read
  • serialiseerbaar

Transaction Isolation levels

van deze opties biedt Oracle Read commited aan als het standaard isolatieniveau, om ervoor te zorgen dat er geen mogelijkheid is dat een gebruiker de wijzigingen ziet die door een andere gebruiker zijn gemaakt en die nog niet zijn gecommit. Er mogen geen gegevens worden gelezen die als “vuil” zijn gemarkeerd en er moet een mechanisme zijn dat robuust genoeg is om dit alles mogelijk te maken.

om dit mogelijk te maken, speelt SCN een essentiële rol.

SCN, een inleiding

systeem Commit nummer kan worden begrepen als Oracle ‘ s representatie van tijd. Oracle gebruikt SCN voor het controleren van consistentie, voor het uitvoeren van herstel en om de veranderingsvectoren in de redo te bestellen.

de SCN wordt op veel locaties gevonden – zowel in het geheugen als op de schijf. Verschillende locaties worden gebruikt om het databasesysteem te helpen verschillende toestanden van de database te identificeren. Op sommige locaties wordt het bijvoorbeeld gebruikt om de voltooiingsstatus van de transactie aan te geven en of deze actief of gecommit is.

in tegenstelling tot wat vaak wordt gedacht, wordt het niet alleen gegenereerd op het moment van commit, hoewel dat is wat de naam zelf suggereert. SCN is er de hele tijd in de database, die een tijd gedeelte voor de operatie die gebeurt op dat moment van de tijd. Het is niet helemaal onnauwkeurig om te zeggen dat SCN niet gegenereerd wordt met een commit, maar dat is niet de enige manier waarop SCN wordt gegenereerd.

het SCN is een tweedelig nummer dat op verzoek wordt gegenereerd als reactie op een gebeurtenis. Het is een beetje als de datum en tijd afgeleid van een kalender en klok combinatie; de klok verandert snel en alleen wanneer het is gegaan door de volledige 24 uur cyclus is de overflow – de kalender – veranderd. Echter, de gebeurtenis die de klok verandert is de’ slinger ‘ en is regelmatig, terwijl de gebeurtenis die de SCN verandert een aanroep is naar een specifieke interne functie.

vergelijkbaar met een kalender/klok tijdstempel, kan de waarde worden geregistreerd op verschillende plaatsen, elk voor een ander gebruik.

een voorbeeld uit de echte wereld dat lijkt op een SCN is een luchthavenklok. Twee mensen voeren een luchthaven op hetzelfde moment en kunnen de kloktijd noteren. Dat moment geeft ons ‘een entry SCN’ die toevallig hetzelfde is voor beide mensen. De ene persoon krijgt een bagagewagen voordat hij incheckt, de andere gaat direct naar de incheckbalie. Wanneer de stoelen worden toegewezen, kan elke persoon een andere ‘check-in SCN’ krijgen omdat de tijden iets anders zijn. Een “boarding SCN” kan worden toegewezen om aan te geven wanneer elk van hen aan boord is gegaan, maar beide krijgen dezelfde “take-off SCN”.

net als de combinatie van kalender en klok, zal de SCN bij normaal gebruik gegarandeerd toenemen. Er is geen garantie dat het nummer sequentieel zal zijn (ontbrekende nummers).

dus waar wordt deze informatie over SCN gebruikt in de Oracle-database? Bijna overal. Net zoals we tijd associëren met elke activiteit van ons, wordt SCN ook geassocieerd met elk onderdeel van de functionaliteit van de database. Wanneer u bijvoorbeeld gegevens uit een tabel probeert te selecteren, wordt SCN gebruikt om te bevestigen of die gegevens consistent zijn of niet. SCN is ook te vinden in de transactie Headers van het gegevensblok. Dit SCN zou het tijdstip vertegenwoordigen waarop de transactie begon en werd vastgelegd. Op dezelfde manier wordt voor elke uitgevoerde wijziging een vermelding in het redo-log bijgehouden en voor elk van deze vermeldingen wordt SCN gebruikt om het tijdstip van het optreden van de transactie aan te geven.

Read consistence gebruikt SCN om te beslissen hoe lang het moet toepassen ongedaan maken over de vuile buffer zodat de Read consistente data aanvraag voor een sessie kan worden voltooid. En zoals bekend wordt SCN verhoogd met elke commit operatie.

SCN-formaat en-structuur

SCN is een enorm getal met twee componenten: SCN-basis & SCB-Wrap.

SCN is een 6 byte (48 bits) getal. Van deze 48 bits is SCN_WRAP een 16 bit (2 Bytes) nummer en SCN_BASE een 32 bit (4 Bytes) nummer. Beide base & WRAP worden gebruikt om de increment van de SCN te controleren en om ervoor te zorgen dat de database er niet uit zal lopen. SCN_WRAP wordt verhoogd met 1 wanneer SCN_BASE de waarde van 4 miljard bereikt en SCN_BASE 0 wordt.

van Oracle versie 12c is het SCN-nummer een 8 byte-nummer.

dus hoe zien we de huidige SCN-waarde? De makkelijkste manier is om de view V$DATABASE te bevragen. Neem een kijkje:

1
2
3
4
5

SQL> selecteer current_scn van V$database;
CURRENT_SCN
———–
1123790

Zoals we kunnen zien, dat de SCN wordt weergegeven als een getal. Dit is goed omdat het maakt het gebruik van SCN gemakkelijk voor ons in onze verklaringen uitvoeren van herstel, flashback, enz. Als we willen, kunnen we SCN ook omzetten naar een hexadecimale waarde:

1
2
3
4
5

SQL> selecteer to_char(‘1123790′,’xxxxxxxx’) scn_hex van dual;
SCN_HEX
———
1125ce

Hier is een voorbeeld van de uitvoer vanuit dezelfde weergave geopend paar keer:

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

SQL> selecteer current_scn van V$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886

Opvallend is dat deze toename in de SCN-waarde blijkt een belangrijk aspect van de SCN. We kunnen zien dat bij elke uitvoering, er een toename is in de telling van de SCN. Door de view V$DATABASE te bevragen, veroorzaken we eigenlijk de sprong in het SCN nummer.

Smon_scn_time Table

de makkelijkste manier om beide waarden te zien is uit een interne tabel die eigendom is van SYS user – SMON_SCN_TIME. Het volgende is een output van hetzelfde (11204).

1
2
3
4
5
6

SQL> select SCN_wrp, SCN_bas, SCN from smon_SCN_time where rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406

deze tabel bevat de items van de gegenereerde SCN ‘ s. Het slaat de gegevens op in stappen van ongeveer 5 minuten en bevat 5 dagen aan gegevens. Dit betekent dat de tabel ongeveer 1440 records bevat. Het exacte aantal records zal enigszins variëren, omdat de opslagverhoging niet precies 5 minuten is.

1
2
3
4
5

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

In versies van Oracle voorafgaand aan 10g, de tijd in kaart brengen van SCN met de tijd was +/- 5 minuten maar van 10g verder, dit is veranderd naar +/- 3 seconden. Omdat dit stores in een interne tabel zijn, staat Oracle geen toegang toe tot de informatie uit deze tabel rechtstreeks. Om toegang te krijgen, API ‘ s worden verstrekt. Een dergelijke API is van het pakket DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, dat kan worden gebruikt om toegang te krijgen tot het volgnummer uit deze tabel. Een voorbeeld hiervan wordt hieronder gegeven (met dank aan Tom Kyte voor de query):

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
select SCN_to_timestamp(SCN) ts, min(SCN), max(SCN)
from (
selecteer dbms_flashback.get_system_change_number()-niveau SCN
van dual
verbinding maken met het niveau van <= 100
)
groep door SCN_to_timestamp(SCN)
* om door SCN_to_timestamp(SCN)
SQL> /
TS MIN(SCN) MAX(SCN)
————————————————————————— ———- ———-
06-MEI-16 05.22.04.000000000 PM 1245323 1245323
06-MEI-16 05.22.07.000000000 PM 1245324 1245324
06-MEI-16 05.22.10.000000000 PM 1245325 1245325
06-MEI-16 05.22.13.000000000 PM 1245326 1245326
06-MEI-16 05.22.16.000000000 PM 1245327 1245327
06-MEI-16 05.22.19.000000000 PM 1245328 1245328
06-MEI-16 05.22.22.000000000 PM 1245329 1245329
06-MEI-16 05.22.25.000000000 PM 1245330 1245330
06-MEI-16 05.22.28.000000000 PM 1245331 1245331
06-MEI-16 05.22.31.000000000 PM 1245332 1245332
06-MEI-16 05.22.34.000000000 PM 1245333 1245333
06-MEI-16 05.22.37.000000000 PM 1245334 1245334
06-MEI-16 05.22.40.000000000 PM 1245335 1245335
06-MEI-16 05.22.43.000000000 PM 1245336 1245336
06-MEI-16 05.22.46.000000000 PM 1245337 1245337
06-MEI-16 05.22.49.000000000 PM 1245338 1245338
06-MEI-16 05.22.52.000000000 PM 1245339 1245339

Hoe kunnen we in kaart SCN met Timestamp in eerdere versies dan versie 10g?

het is belangrijk om te onthouden dat deze tabel niet laat zien waarom er een toename zou zijn in de snelheid van toename van de SCN-nummers. Met een beetje opmaak, is het mogelijk om een idee van de SCN nummers gegenereerd, maar de bron van hun groei zal niet duidelijk uit deze tabel.

een andere manier om dit te controleren is vanuit de weergave V$LOG_HISTORY. De weergave bevat de SCN in de vorm van de kolommen FIRST_CHANGE# en NEXT_CHANGE# en we kunnen door deze twee kolommen de hoeveelheid SCN ‘ s zien die gedurende een bepaalde periode in de database zijn gegenereerd. De ” first_change# is de laagste SCN die verschijnt in het gearchiveerde logbestand op een gegeven volgnummer van deze thread. De” next_change# ” is de laagste SCN die verschijnt in het volgende gearchiveerde logbestand.

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

SQL> selecteer thread#, first_change#,next_change# from V$log_history;
THREAD# 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

Als met SMON_SCN_TABLE het is niet mogelijk om het vinden van de oorzaak van de toename van de generatie van de SCN getallen uit deze tabel bekijken. Toch kunt u deze weergave zowel in de enkele instantie als in een RAC-omgeving gebruiken.

SCN verhoogt met behulp van een reeks?

het zou nu vrij duidelijk moeten zijn dat SCN een getal lijkt te zijn dat voortdurend toeneemt. Interessant, ook al is het een getal, Oracle maakt geen gebruik van een reeks om het te verhogen, maar maakt gebruik van interne functies in plaats daarvan. Bijvoorbeeld, om de SCN_BASE te verhogen, is de intern gebruikte functie KCMGAS (Get en Advance SCN). Deze functie wordt aangeroepen elke keer dat een nieuwe SCN wordt gevraagd en de aanroep voor deze functie wordt verhoogd. Op dezelfde manier als deze functie wordt KCMGCS (Get Current SCN) gebruikt om de huidige SCN en de aanroep te krijgen die daarvoor wordt gebruikt. Deze functie aanroepen kunnen worden gezien vanuit de V $ sysstat view. Een beschrijving van deze statistieken is te vinden in de Referentiegids 12.1.

laten we eens kijken hoe deze aanroepen verband houden met de SCN generatie. We gebruiken hier twee sessies-Een om de aanroepen in de V$SYSSTAT view te zien, en de andere sessie om de SCN te Pullen.

1
2
3
4
5
6
7
8
9
10

Sessie -1
SQL> l
1* selecteer current_SCN van V$database
SQL> /
CURRENT_SCN
———–
698815
SQL>

Voor deze SCN, dit waren de waarden voor V$sysstat:

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

SQL> l
1 selecteer naam,waarde van V$sysstat
2* where naam like ‘%oproepen tot ‘ %’
SQL> /
NAAM WAARDE
—————————————————————- ———-
bellen naar kcmgcs 427
oproepen naar kcmgrs 0
oproepen naar kcmgas 7272
oproepen voor snapshot SCN: kcmgss 159790
SQL>

laten we een query geven om de huidige SCN te zien in sessie 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 hier is het resultaat van de tweede sessie 2:

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

SQL> /
NAAM WAARDE
—————————————————————- ———-
bellen naar kcmgcs 427
oproepen naar kcmgrs 0
oproepen naar kcmgas 7272
oproepen te krijgen momentopname SCN: kcmgss 159790
SQL> /
NAAM WAARDE
—————————————————————- ———-
bellen naar kcmgcs 427
oproepen naar kcmgrs 0
oproepen naar kcmgas 7278
oproepen te krijgen momentopname SCN: kcmgss 159905
SQL>

We kunnen zien dat de oproepen voor de KCMGAS is gestegen tot 7278 van de laatste waarde, 7272. Omdat Oracle geen reeks gebruikt om het aantal te verhogen, is er geen garantie dat het SCN-nummer altijd in dezelfde volgorde zal worden verhoogd.

conclusie

In dit artikel hebben we gekeken naar wat het SCN is, hoe het te bekijken en wat de vereisten daarvoor zijn. In het volgende artikel zullen we zien welke verschillende soorten SCN ‘ s beschikbaar zijn en hoe ze worden gebruikt in de database. Blijf kijken!

Write a Comment

Het e-mailadres wordt niet gepubliceerd.