FOR mange som jobber Med Oracle database, ER SCN (System Change Number) et emne som interesserer dem sterkt – men til tross for at Det er et fascinerende emne, er DET også forvirrende. I denne artikkelen vil VI lære nitty-gritty AV SCN: hva det er, hvor det brukes, og hvordan det fungerer.
det er verdt å nevne at dette ikke er og ikke kan være fullstendig dekning av alle detaljer OM SCN. Med det sagt, la oss starte.
SCN – Hvorfor trenger vi DET?
Anta at det er slutten av måneden og dens lønningsdag. Du er I Lønn-gruppen og, med riktig myndighet, har utstedt en spørring for å trekke den nåværende lønnsberegningen for alle ansatte. Tall flyter over skjermen, alt går bra.
Anta at en kollega starter en ny lønnskjøring mens du ser på utdataene, og at den satsvise jobben fjerner gjeldende beregningssammendrag. Ting ville sikkert bli forvirrende hvis produksjonen din plutselig viste ‘ 0 ‘ for de nye radene som kommer ut.
for dette scenariet vil du sannsynligvis forvente at utdataene gjenspeiler databasens tilstand-innholdet i hver rad-slik det eksisterte i det øyeblikket du utstedte spørringen.
En av garantiene Til oracle-databasen er at «det er ingen skitne leser av brukerdata». Om nødvendig vil Oracle gjenoppbygge hver rad til stabil tilstand på et øyeblikk da spørringen ble utstedt.
Oracle gjør det pent og veldig nøyaktig gjennom en» timer » av seg selv, kjent som Systemendringsnummeret, AKA SCN.
vi vil diskutere disse aspektene AV SCN:
- selve tallet
- tallgeneratoren
- Steder der nummeret er lagret
Så la oss begynne!
Byggeklosser for Å forstå SCN
for å undersøke SCN må flere begreper forstås. Selv om disse definisjonene er godt dokumentert, er det verdt å gjenta dem her:
Transaksjon
Fra Concepts guide Of Oracle Online Documentation:
«en transaksjon er en logisk, atomisk arbeidsenhet som inneholder en ELLER flere SQL-setninger. En transaksjon grupperer SQL-setninger slik at DE enten er alle forpliktet, noe som betyr at de brukes på databasen, eller alle rullet tilbake, noe som betyr at de er ugjort fra databasen. Oracle Database tildeler hver transaksjon en unik identifikator kalt en transaksjons-ID».
ganske enkelt: når vi starter en transaksjon, starter vi et sett med endringer. Disse må enten fullføres i helhet eller ikke fullføres i det hele tatt. Som transaksjonene skjer i databasen, må brukerne lese et område som er endret, ikke påvirkes av bivirkninger som kan endre resultatene.
for at transaksjonene skal fungere riktig i en database, må fire ACID-regler følges av databasen. Disse er:
- Atomisitet;
- Konsistens;
- Isolasjon;
- Holdbarhet.
så hvor passer SCN inn i alt dette? Og svaret på det spørsmålet er at Bruk AV SCN bare Oracle opprettholder datakonsistens. Dette er gjort for å sikre at ethvert tidspunkt, er det ingen avvik i resultatene som vises til de andre når en bruker endrer noe, og vice versa.
for Å oppsummere, I Oracle, er prinsippet Om «Lesere venter ikke på forfattere og forfattere trenger ikke lesere» helt og fullt fulgt. For å gjøre dette er det av største betydning at dataene, som for øyeblikket gjennomgår noen form for endring, ikke må være tilgjengelige for noen unntatt personen som gjør disse endringene. For transaksjoner er dette nødvendig for å opprettholde integriteten til dataene. Tre ting kan oppstå som kan forstyrre denne integriteten-Dirty Read, Fuzzy Read og Phantom Read. For å sikre at det ikke vil være noen form for integritetsproblemer i disse transaksjonene, er ulike Isolasjonsnivåer tilgjengelige. Disse er:
- Les Uforpliktet
- Les Forpliktet
- Repeterbar Les
- Serialiserbar
Transaksjonsisolasjonsnivåer
Fra Disse Tilbyr Oracle Les Forpliktet som standard isolasjonsnivå, og sørger for at det ikke er mulighet for at en bruker ser endringene som er gjort av en annen bruker som ennå ikke er forpliktet. Det må ikke leses over dataene som er merket som «skitne», og det må være en mekanisme som er robust nok til å gjøre alt dette mulig.
FOR å gjøre DETTE mulig, SPILLER SCN en viktig rolle.
SCN, En Introduksjon
System Commit-Nummer kan forstås Som Oracles representasjon av tid. Oracle bruker SCN for å kontrollere konsistens, for å utføre utvinning og for å bestille endringsvektorer i redo.
SCN finnes på mange steder – både i minnet og på disken. Ulike steder brukes til å hjelpe databasesystemet identifisere ulike tilstander i databasen. På enkelte steder brukes det for eksempel til å angi transaksjonens fullføringsstatus og om den er aktiv eller forpliktet.
I Motsetning til popular tro, blir det ikke generert bare på tidspunktet for commit, selv om det er det navnet selv antyder. SCN er der hele tiden i databasen, som representerer en tidsdel for operasjonen som skjer på det øyeblikk av tid. Det er ikke helt unøyaktig å si AT SCN ikke blir generert med en forpliktelse, det gjør det – men DET er ikke den eneste MÅTEN SCN genereres PÅ.
SCN ER et todelt nummer som genereres på forespørsel, som svar på en hendelse. Det er noe som dato og klokkeslett avledet fra en kalender og klokke kombinasjon; klokken endres raskt, og bare når den har gått gjennom hele 24 timers syklus, er overløpet – kalenderen – endret. Men hendelsen som endrer klokken er ‘pendelen’ og er vanlig, mens hendelsen som endrer SCN er et kall til en bestemt intern funksjon.
i Likhet med en kalender/klokke tidsstempel, kan verdien registreres på en rekke forskjellige steder, hver for en annen bruk.
en ekte verden eksempel ligner PÅ EN SCN er en flyplass klokke. To personer går inn på en flyplass samtidig og kan notere klokketiden. Det øyeblikket gir oss ‘en oppføring SCN’ som skjer for å være den samme for både mennesker. En person får en vogn for bagasje før du sjekker inn, mens den andre går direkte til innsjekkingsdisken. Nar setene er tildelt, kan hver person fa en annen ‘check-IN SCN’ siden tider er litt forskjellige. En ‘boarding SCN’ kan tildeles for å indikere når hver har bordet, men begge får samme ‘take-off SCN’.
som kombinasjonen av kalender og klokke, er SCN garantert å øke under normal drift. Det er ingen garanti for at nummeret vil være sekvensielt (manglende tall).
Så hvor er denne informasjonen om SCN brukt i oracle-databasen? Vel, nesten overalt. AKKURAT som vi forbinder Tid med hver aktivitet av oss, ER SCN også knyttet til alle deler av databasens funksjonalitet. NÅR DU for eksempel prøver å velge data fra en tabell, BRUKES SCN til å bekrefte om dataene er konsistente eller ikke. SCN finnes også i datablokkens Transaksjonsoverskrifter. DENNE SCN ville representere tiden da transaksjonen startet og da den ble begått. PÅ samme måte opprettholdes EN oppføring i redo-loggen for hver endring som utføres, og FOR HVER av disse oppføringene brukes SCN til å representere transaksjonstidspunktet.
Les konsistens bruker SCN til å bestemme hvor lenge Den må bruke Angre over den skitne bufferen, slik at les konsekvent dataforespørsel for en økt kan fullføres. OG SOM det er kjent, ØKES SCN med hver forplikte operasjon.
SCN Format og Struktur
SCN ER et stort antall MED to komponenter til det: SCN Base & SCB Wrap.
SCN er et 6 byte (48 bits) tall. AV disse 48 bitene ER SCN_WRAP et 16 bit (2 Byte) nummer OG SCN_BASE er et 32 bit (4 Byte) nummer. BÅDE BASE & WRAP brukes til å kontrollere SCNS økning og for å sikre at databasen ikke går tom for det. SCN_WRAP økes med 1 NÅR SCN_BASE når verdien av 4 Milliarder Og SCN_BASE blir 0.
FRA Oracle Versjon 12c ER SCN-nummeret et 8 byte-nummer.
så hvordan ser vi DEN nåværende SCN-verdien? Den enkleste måten er å spørre view V$ – DATABASEN. Ta en titt:
1
2
3
4
5
|
SQL > velg current_scn fra v$database;
CURRENT_SCN
———–
1123790
|
SOM vi kan se, VISES DET SCN som et tall. Dette er bra fordi det gjør BRUK AV SCN lett for oss i våre uttalelser utfører recovery, flashback, etc. Hvis vi vil, kan VI konvertere SCN til En Heksadesimal verdi også:
1
2
3
4
5
|
SQL > velg to_char (‘1123790’, ‘xxxxxxxx’) scn_hex fra dual;
SCN_HEX
———
1125ce
|
Her er et eksempel på utgangen fra samme visning tilgjengelig par ganger:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL > velg current_scn fra v$database;
CURRENT_SCN
———–
1178883
SQL> /
CURRENT_SCN
———–
1178885
SQL> /
CURRENT_SCN
———–
1178886
|
Interessant nok viser denne økningen I SCN-verdien et viktig aspekt AV SCN. Vi kan se at med hver utførelse er det en økning i tellingen AV SCN. Ved å spørre view V$ – DATABASEN, forårsaker vi faktisk hoppet I SCN-nummeret.
Smon_scn_time Tabell
den enkleste måten å se begge disse verdiene er fra en intern tabell eid AV SYS user – SMON_SCN_TIME. Følgende er en utgang fra det samme (11204).
1
2
3
4
5
6
|
SQL > velg SCN_wrp, SCN_bas, SCN fra smon_SCN_time der rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
denne tabellen inneholder oppføringer av SCNs generert. Den lagrer dataene i omtrent 5 minutters trinn og holder 5 dagers verdi av data. Dette betyr at tabellen inneholder ca 1440 poster. Det nøyaktige antallet poster vil variere noe siden lagringsøkningen ikke er nøyaktig 5 minutter.
1
2
3
4
5
|
SQL > velg antall ( * ) FRA SMON_SCN_TIME;
ANTALL(*)
———-
1494
|
i versjoner Av Oracle før 10g var tidskartleggingen AV SCN med tiden + / – 5 minutter, men fra 10g og utover, endres dette til + / – 3 sekunder. Da Dette er butikker i et internt bord, Tillater Oracle ikke tilgang til informasjonen fra denne tabellen direkte. For å få tilgang til Det, Er Apier gitt. En SLIK API er fra pakken DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, som kan brukes til å få tilgang til sekvensnummeret fra denne tabellen. Et eksempel på dette er gitt nedenfor (takk Til Tom Kyte for spørringen):
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
velg SCN_to_timestamp (SCN) ts, min(SCN), maks (SCN)
fra (
velg dbms_flashback.get_system_change_number()-NIVÅ SCN
fra dual
koble etter nivå <= 100
)
gruppe Av SCN_to_timestamp (SCN)
* bestill Av SCN_to_timestamp (SCN)
SQL> /
TS MIN(SCN) MAKS (SCN))
————————————————————————— ———- ———-
06- MAI – 16 05.22.04.000000000 PM 1245323 1245323
06-MAI – 16 05.22.07.000000000 PM 1245324 1245324
06-MAI-16 05.22.10.000000000 PM 1245325 1245325
06-MAI – 16 05.22.13.000000000 PM 1245326 1245326
06-MAI – 16 05.22.16.000000000 PM 1245327 1245327
06-MAI – 16 05.22.19.000000000 PM 1245328 1245328
06-MAI – 16 05.22.22.000000000 PM 1245329 1245329
06-MAI – 16 05.22.25.000000000 PM 1245330 1245330
06-MAI – 16 05.22.28.000000000 PM 1245331 1245331
06-MAI – 16 05.22.31.000000000 PM 1245332 1245332
06-MAI – 16 05.22.34.000000000 PM 1245333 1245333
06-MAI-16 05.22.37.000000000 PM 1245334 1245334
06-MAI – 16 05.22.40.000000000 PM 1245335 1245335
06-MAI – 16 05.22.43.000000000 PM 1245336 1245336
06-MAI – 16 05.22.46.000000000 PM 1245337 1245337
06-MAI – 16 05.22.49.000000000 PM 1245338 1245338
06-MAI – 16 05.22.52.000000000 PM 1245339 1245339
|
Hvordan kan VI kartlegge SCN Med Tidsstempel i versjoner før 10g?
Det er viktig å huske at denne tabellen ikke viser hvorfor DET ville være noen økning i økningsraten I SCN-tallene. Med litt formatering er det mulig å få en ide om SCN-tallene som genereres, men kilden til veksten vil ikke være tydelig fra denne tabellen.
En annen måte å sjekke dette på er fra visningen V $ LOG_HISTORY. Visningen inneholder SCN i form AV kolonnene FIRST_CHANGE# og NEXT_CHANGE#, og vi kan se gjennom disse to kolonnene Mengden SCNs generert i databasen over en tidsperiode. «First_change# er den laveste SCN som vises i den arkiverte loggfilen på et gitt sekvensnummer i denne tråden. «Next_change#» er den laveste SCN som vises i den neste arkiverte loggfilen.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL > velg tråd#, first_change#, next_change # fra v$log_history;
TRÅD# 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
|
Som MED SMON_SCN_TABLE er det ikke mulig å finne kilden til økningen I genereringen AV SCN-tallene fra denne tabellvisningen. Likevel kan du bruke denne visningen i enkeltforekomsten, så vel som I ET rac-miljø.
SCN Øker Ved hjelp Av En Sekvens?
Nå bør DET være ganske tydelig AT SCN ser ut TIL å være et tall som stadig øker. Interessant, Selv Om Det er et tall, Bruker Oracle ikke noen sekvens for å øke den, men bruker interne funksjoner i stedet. For eksempel, for å øke SCN_BASE, er funksjonen som brukes internt kcmgas (Get og Advance SCN). Denne funksjonen kalles hver GANG en NY SCN blir bedt om, og kallet for denne funksjonen økes. På samme måte SOM denne funksjonen brukes KCMGCS (Get Current SCN) til å få gjeldende SCN og samtalen som brukes til den. Disse funksjonssamtalene kan ses fra v$sysstat-visningen. En beskrivelse av denne statistikken finnes i 12.1 Referansehåndbok.
La oss se hvordan disse samtalene knytter SEG til SCN-generasjonen. Vi bruker to økter her-en for å se samtalene I visningen V$SYSSTAT-visningen, og den andre økten for å trekke SCN.
1
2
3
4
5
6
7
8
9
10
|
Økt -1
SQL> l
1* velg current_SCN fra v$database
SQL> /
CURRENT_SCN
———–
698815
SQL>
|
FOR DENNE SCN var disse verdiene For V$sysstat:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL > l
1 velg navn, verdi Fra v$sysstat
2 * hvor navn som’ %samtaler til% ‘
SQL> /
NAVN VERDI
—————————————————————- ———-
samtaler til kcmgcs 427
samtaler til kcmgrs 0
samtaler til kcmgas 7272
samtaler for å få øyeblikksbilde SCN: kcmgss 159790
SQL>
|
la oss utstede en spørring for å se gjeldende SCN i økt 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 her er resultatet av den andre økten 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> /
NAVN VERDI
—————————————————————- ———-
anrop til kcmgcs 427
anrop til kcmgrs 0
anrop til kcmgas 7272
anrop for å få stillbilde SCN: kcmgss 159790
SQL> /
NAVN VERDI
—————————————————————- ———-
anrop til kcmgcs 427
anrop til kcmgrs 0
anrop til kcmgas 7278
anrop for å få øyeblikksbilde SCN: kcmgss 159905
SQL>
|
vi kan se at anropene TIL KCMGAS har økt til 7278 fra den siste verdien, 7272. Siden Oracle ikke bruker en sekvens for å øke tallet, er Det ingen garanti for AT SCN-nummeret alltid vil økes i samme rekkefølge.
Konklusjon
i denne artikkelen har vi sett på HVA SCN er, hvordan du ser det og hva kravene til det er. I neste artikkel vil vi se hvilke forskjellige Typer Scn er tilgjengelige og hvordan de brukes i databasen. Følg med!