Für viele Menschen, die mit Oracle Database arbeiten, ist SCN (System Change Number) ein Thema, das sie sehr interessiert – aber trotzdem ist es ein faszinierendes Thema, es ist auch verwirrend. In diesem Artikel lernen wir das Wesentliche von SCN kennen: Was es ist, wo es verwendet wird und wie es funktioniert.
Es ist erwähnenswert, dass dies keine vollständige Abdeckung aller Details über SCN ist und sein kann. Nachdem das gesagt ist, fangen wir an.
SCN- Warum brauchen wir es?
Angenommen, es ist das Ende des Monats und sein Zahltag. Sie befinden sich in der Payroll-Gruppe und haben mit entsprechender Berechtigung eine Abfrage ausgegeben, um die aktuelle Gehaltsberechnung aller Mitarbeiter abzurufen. Zahlen fließen über den Bildschirm, alles läuft super.
Angenommen, während Sie sich die Ausgabe ansehen, startet ein Kollege einen neuen Lohnlauf, und dieser Stapeljob löscht die aktuelle Berechnungszusammenfassung. Die Dinge würden sicherlich verwirrend werden, wenn Ihre Ausgabe plötzlich ‚0‘ für die neuen Zeilen anzeigen würde.
In diesem Szenario würden Sie wahrscheinlich erwarten, dass die Ausgabe den ‚Status der Datenbank‘ – den Inhalt jeder Zeile – so widerspiegelt, wie er zum Zeitpunkt der Abfrage vorhanden war.
Eine der Garantien der Oracle-Datenbank ist, dass „es keine schmutzigen Lesevorgänge von Benutzerdaten gibt“. Falls erforderlich, erstellt Oracle jede Zeile zum Zeitpunkt der Ausgabe der Abfrage in den stabilen Zustand zurück.
Oracle macht es schön und sehr genau durch einen eigenen „Timer“, bekannt als die System Change Number, AUCH bekannt als SCN.
Wir werden diese Aspekte des SCN diskutieren:
- Die Nummer selbst
- Der Zahlengenerator
- Orte, an denen die Nummer gespeichert ist
Also fangen wir an!
Bausteine zum Verständnis von SCN
Um SCN zu untersuchen, müssen mehrere Begriffe verstanden werden. Obwohl diese Definitionen gut dokumentiert sind, lohnt es sich, sie hier zu wiederholen:
Transaktion
Aus dem Concepts Guide der Oracle Online-Dokumentation:
“ Eine Transaktion ist eine logische, atomare Arbeitseinheit, die eine oder mehrere SQL-Anweisungen enthält. Eine Transaktion gruppiert SQL-Anweisungen so, dass sie entweder alle festgeschrieben werden, was bedeutet, dass sie auf die Datenbank angewendet werden, oder alle zurückgesetzt werden, was bedeutet, dass sie aus der Datenbank rückgängig gemacht werden. Oracle Database weist jeder Transaktion eine eindeutige Kennung zu, die als Transaktions-ID“ bezeichnet wird.
Einfacher: Wenn wir eine Transaktion starten, initiieren wir eine Reihe von Änderungen. Diese müssen entweder vollständig oder gar nicht abgeschlossen sein. Da die Transaktionen in der Datenbank stattfinden, dürfen die Benutzer, die einen Bereich lesen, der sich geändert hat, nicht von Nebenwirkungen betroffen sein, die ihre Ergebnisse verändern können.
Damit die Transaktionen in einer Datenbank korrekt funktionieren, muss die Datenbank vier ACID-Regeln befolgen. Dies sind:
- Atomizität;
- Konsistenz;
- Isolation;
- Haltbarkeit.
Also, wo passt SCN in all das? Und die Antwort auf diese Frage ist, dass die Verwendung von SCN nur Oracle die Datenkonsistenz aufrechterhält. Dies geschieht, um sicherzustellen, dass zu jedem Zeitpunkt keine Diskrepanz in den Ergebnissen besteht, die den anderen angezeigt werden, wenn ein Benutzer etwas ändert, und umgekehrt.
Zusammenfassend wird in Oracle das Prinzip „Leser warten nicht auf Schriftsteller und Schriftsteller brauchen keine Leser“ vollständig und wahrhaftig befolgt. Um dies zu erreichen, ist es von größter Bedeutung, dass die Daten, die sich derzeit in irgendeiner Form ändern, niemandem außer der Person, die diese Änderungen vornimmt, zur Verfügung stehen dürfen. Bei Transaktionen ist dies erforderlich, um die Integrität der Daten zu gewährleisten. Drei Dinge können auftreten, die diese Integrität stören können – Dirty Read, Fuzzy Read und Phantom Read. Um sicherzustellen, dass bei diesen Transaktionen keine Integritätsprobleme auftreten, stehen verschiedene Isolationsstufen zur Verfügung. Dies sind:
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
Transaktionsisolationsstufen
Oracle bietet Read Committed als Standard-Isolationsstufe an, um sicherzustellen, dass ein Benutzer die von einem anderen Benutzer vorgenommenen Änderungen, die noch nicht festgeschrieben sind, nicht sehen kann. Es dürfen keine Daten ausgelesen werden, die als „schmutzig“ gekennzeichnet sind, und es muss ein Mechanismus vorhanden sein, der robust genug ist, um all dies zu ermöglichen.
Um dies zu ermöglichen, spielt SCN eine entscheidende Rolle.
SCN, eine Einführung
System Commit Number kann als Orakels Darstellung der Zeit verstanden werden. Oracle verwendet SCN zur Kontrolle der Konsistenz, zur Durchführung der Wiederherstellung und zur Reihenfolge der Änderungsvektoren im Redo.
Der SCN befindet sich an vielen Stellen – sowohl im Arbeitsspeicher als auch auf der Festplatte. Verschiedene Speicherorte werden verwendet, um dem Datenbanksystem zu helfen, verschiedene Zustände der Datenbank zu identifizieren. An einigen Stellen wird es beispielsweise verwendet, um den Abschlussstatus der Transaktion anzugeben und anzugeben, ob sie aktiv oder festgeschrieben ist.
Entgegen der landläufigen Meinung wird es nicht nur zum Zeitpunkt des Commits generiert, obwohl dies der Name selbst vermuten lässt. SCN ist die ganze Zeit in der Datenbank vorhanden und repräsentiert einen Zeitabschnitt für die Operation, die zu diesem Zeitpunkt stattfindet. Es ist nicht völlig ungenau zu sagen, dass SCN nicht mit einem Commit generiert wird, aber das ist nicht die einzige Art, wie SCN generiert wird.
Die SCN ist eine zweiteilige Nummer, die auf Anfrage als Reaktion auf ein Ereignis generiert wird. Es ist ein bisschen wie das Datum und die Uhrzeit, die aus einer Kombination von Kalender und Uhr abgeleitet sind; Die Uhr ändert sich schnell und erst wenn sie den kompletten 24–Stunden–Zyklus durchlaufen hat, wird der Überlauf – der Kalender – geändert. Das Ereignis, das die Uhr ändert, ist jedoch das Pendel und regelmäßig, während das Ereignis, das den SCN ändert, ein Aufruf einer bestimmten internen Funktion ist.
Ähnlich wie bei einem Kalender-/Uhrzeitstempel kann der Wert an verschiedenen Orten aufgezeichnet werden, jeweils für eine andere Verwendung.
Ein reales Beispiel, das einem SCN ähnelt, ist eine Flughafenuhr. Zwei Personen betreten gleichzeitig einen Flughafen und können die Uhrzeit notieren. Dieser Moment gibt uns einen Eintrag SCN, der für beide Personen gleich ist. Eine Person bekommt vor dem Einchecken einen Gepäckwagen, während die andere direkt zum Check-in-Schalter geht. Wenn die Sitzplätze zugewiesen werden, kann jede Person eine andere Check-in-SCN erhalten, da die Zeiten geringfügig abweichen. Eine ‚Boarding SCN‘ kann zugewiesen werden, um anzuzeigen, wann jeder an Bord gegangen ist, aber beide erhalten die gleiche ‚Take-off SCN‘.
Wie die kombination von kalender und uhr, die SCN ist garantiert zu werden erhöhung unter normalen betrieb. Es gibt keine Garantie, dass die Nummer sequentiell ist (fehlende Nummern).
Wo werden diese Informationen zu SCN in der Oracle-Datenbank verwendet? Nun, fast überall. So wie wir Zeit mit jeder unserer Aktivitäten verknüpfen, ist SCN auch mit jedem Teil der Datenbankfunktionalität verbunden. Wenn Sie beispielsweise versuchen, Daten aus einer Tabelle auszuwählen, wird SCN verwendet, um zu bestätigen, ob diese Daten konsistent sind oder nicht. SCN befindet sich auch in den Transaktionsheadern des Datenblocks. Dieser SCN würde den Zeitpunkt darstellen, zu dem die Transaktion gestartet und festgeschrieben wurde. In ähnlicher Weise wird für jede durchgeführte Änderung ein Eintrag im Wiederherstellungsprotokoll beibehalten, und für jeden dieser Einträge wird SCN verwendet, um den Zeitpunkt des Auftretens der Transaktion darzustellen.
Read consistency verwendet SCN, um zu entscheiden, wie lange Undo über den Dirty Buffer angewendet werden muss, damit die read Consistency-Datenanforderung für eine Sitzung abgeschlossen werden kann. Und wie bekannt, wird SCN mit jeder Commit-Operation inkrementiert.
SCN-Format und -Struktur
SCN ist eine große Zahl mit zwei Komponenten: SCN Base & SCB Wrap.
SCN ist eine 6 Byte (48 Bit) große Zahl. Von diesen 48 Bits ist SCN_WRAP eine 16-Bit-Nummer (2 Byte) und SCN_BASE eine 32-Bit-Nummer (4 Byte). Beide BASE & -METHODEN werden verwendet, um das Inkrement des SCN zu steuern und sicherzustellen, dass die Datenbank nicht leer wird. SCN_WRAP wird um 1 erhöht, wenn SCN_BASE den Wert 4 Milliarden erreicht und SCN_BASE zu 0 wird.
Ab Oracle Version 12c ist die SCN-Nummer eine 8-Byte-Nummer.
Wie sehen wir also den aktuellen SCN-Wert? Am einfachsten ist es, die view V $ -DATENBANK abzufragen. Werfen Sie einen Blick:
1
2
3
4
5
|
SQL> Wählen Sie current_scn aus der V $ -Datenbank aus;
CURRENT_SCN
———–
1123790
|
Wie wir sehen können, wird diese SCN als Zahl angezeigt. Dies ist gut, weil es uns die Verwendung von SCN in unseren Aussagen zur Wiederherstellung, Rückblende usw. erleichtert. Wenn wir wollen, können wir SCN auch in einen hexadezimalen Wert konvertieren:
1
2
3
4
5
|
SQL> select to_char(‚1123790′,’xxxxxxxx‘) scn_hex von dual;
SCN_HEX
———
1125ce
|
Hier ist ein Beispiel für die Ausgabe aus derselben Ansicht, auf die mehrmals zugegriffen wurde:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL > Wählen Sie current_scn aus der V $ -Datenbank aus;
AKTUELL_SCN
———–
1178883
SQLS> /
AKTUELL_SCN
———–
1178885
SQLS> /
AKTUELL_SCN
———–
1178886
|
Interessanterweise zeigt dieser Anstieg des SCN-Wertes einen wichtigen Aspekt von SCN. Wir können sehen, dass mit jeder Ausführung die Anzahl der SCN zunimmt. Durch Abfragen der view V $ -DATENBANK verursachen wir tatsächlich den Sprung in der SCN-Nummer.
SMON_SCN_TIME-Tabelle
Der einfachste Weg, diese beiden Werte anzuzeigen, ist eine interne Tabelle des SYS-Benutzers – SMON_SCN_TIME. Das Folgende ist eine Ausgabe derselben (11204).
1
2
3
4
5
6
|
SQL> wählen Sie SCN_wrp, SCN_bas, SCN aus smon_SCN_time wobei rownum < 3;
SCN_WRP SCN_BAS SCN
———- ———- ———-
0 998222 998222
0 998406 998406
|
Diese Tabelle enthält die Einträge der generierten SCNs. Es speichert die Daten in Schritten von ungefähr 5 Minuten und enthält Daten im Wert von 5 Tagen. Dies bedeutet, dass die Tabelle ungefähr 1440 Datensätze enthält. Die genaue Anzahl der Datensätze variiert geringfügig, da das Speicherinkrement nicht genau 5 Minuten beträgt.
1
2
3
4
5
|
SQL> select count(*) from SMON_SCN_TIME;
ANZAHL(*)
———-
1494
|
In Versionen von Oracle vor 10g betrug die zeitliche Zuordnung von SCN zur Zeit +/- 5 Minuten, ab 10g jedoch +/- 3 Sekunden. Da dies in einer internen Tabelle gespeichert ist, erlaubt Oracle keinen direkten Zugriff auf die Informationen aus dieser Tabelle. Um darauf zuzugreifen, werden APIs bereitgestellt. Eine solche API stammt aus dem Paket DBMS_FLASHBACK .GET_SYSTEM_CHANGE_NUMBER, mit dem auf die Sequenznummer aus dieser Tabelle zugegriffen werden kann. Ein Beispiel dafür ist unten angegeben (danke an Tom Kyte für die Abfrage):
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
Wählen Sie SCN_to_timestamp (SCN) ts, min(SCN), max (SCN)
aus (
wählen Sie dbms_flashback aus.get_system_change_number()-level SCN
von dual
nach Level verbinden <= 100
)
gruppieren nach SCN_to_timestamp(SCN)
* sortieren nach SCN_to_timestamp(SCN)
SQL> /
TS MIN(SCN) MAX(SCN)
————————————————————————— ———- ———-
06- MAI-16 05.22.04.000000000 UHR 1245323 1245323
06- MAI-16 05.22.07.000000000 UHR 1245324 1245324
06- MAI-16 05.22.10.000000000 Uhr 1245325 1245325
06- MAI-16 05.22.13.000000000 UHR 1245326 1245326
06- MAI-16 05.22.16.000000000 UHR 1245327 1245327
06- MAI-16 05.22.19.000000000 UHR 1245328 1245328
06- MAI-16 05.22.22.000000000 UHR 1245329 1245329
06- MAI-16 05.22.25.000000000 UHR 1245330 1245330
06- MAI-16 05.22.28.000000000 UHR 1245331 1245331
06- MAI-16 05.22.31.000000000 UHR 1245332 1245332
06- MAI-16 05.22.34.000000000 UHR 1245333 1245333
06- MAI-16 05.22.37.000000000 Uhr 1245334 1245334
06- MAI-16 05.22.40.000000000 UHR 1245335 1245335
06- MAI-16 05.22.43.000000000 UHR 1245336 1245336
06- MAI-16 05.22.46.000000000 UHR 1245337 1245337
06- MAI-16 05.22.49.000000000 UHR 1245338 1245338
06- MAI-16 05.22.52.000000000 UHR 1245339 1245339
|
Wie können wir SCN mit Zeitstempel in Versionen vor 10g zuordnen?
Es ist wichtig, sich daran zu erinnern, dass diese Tabelle nicht zeigt, warum die Anstiegsrate der SCN-Zahlen steigen würde. Mit ein wenig Formatierung ist es möglich, eine Vorstellung von den generierten SCN-Nummern zu bekommen, aber die Quelle ihres Wachstums wird aus dieser Tabelle nicht ersichtlich sein.
Eine andere Möglichkeit, dies zu überprüfen, ist die Ansicht V$LOG_HISTORY . Die Ansicht enthält den SCN in Form der Spalten FIRST_CHANGE # und NEXT_CHANGE # und wir können durch diese beiden Spalten die Menge an SCNs sehen, die in der Datenbank über einen bestimmten Zeitraum generiert wurden. „first_change # ist der niedrigste SCN, der in der archivierten Protokolldatei unter einer bestimmten Sequenznummer dieses Threads angezeigt wird. „next_change#“ ist der niedrigste SCN, der in der nächsten archivierten Protokolldatei angezeigt wird.
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL> Thread#, first_change#,next_change# aus V$log_history auswählen;
FADEN# 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
|
Wie bei SMON_SCN_TABLE ist es nicht möglich, die Quelle der Zunahme der Generierung der SCN-Nummern aus dieser Tabellenansicht zu finden. Sie können diese Ansicht jedoch sowohl in der Einzelinstanz als auch in einer RAC-Umgebung verwenden.
SCN erhöht sich mit einer Sequenz?
Inzwischen sollte es ziemlich offensichtlich sein, dass SCN eine Zahl zu sein scheint, die ständig zunimmt. Interessanterweise verwendet Oracle, obwohl es sich um eine Zahl handelt, keine Sequenz, um sie zu erhöhen, sondern verwendet stattdessen interne Funktionen. Um beispielsweise die SCN_BASE zu erhöhen, wird intern die Funktion KCMGAS(Get and Advance SCN) verwendet. Diese Funktion wird jedes Mal aufgerufen, wenn ein neuer SCN angefordert wird, und der Aufruf dieser Funktion wird erhöht. Ähnlich wie bei dieser Funktion wird KCMGCS (Get Current SCN) verwendet, um den aktuellen SCN und den dafür verwendeten Aufruf abzurufen. Diese Funktionsaufrufe können aus der V $ sysstat-Ansicht gesehen werden. Eine Beschreibung dieser Statistiken finden Sie im Referenzhandbuch 12.1.
Mal sehen, wie diese Anrufe mit der SCN-Generation verknüpft sind. Wir verwenden hier zwei Sitzungen – eine, um die Aufrufe in der view V $ SYSSTAT-Ansicht anzuzeigen, und die andere Sitzung, um den SCN abzurufen.
1
2
3
4
5
6
7
8
9
10
|
Sitzung -1
SQL> l
1* Wählen Sie current_SCN aus der V $ -Datenbank
SQL> /
AKTUELL_SCN
———–
698815
SQLS>
|
Für diesen SCN waren dies die Werte für V$sysstat:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> l
1 wählen Sie Name, Wert aus V$sysstat
2* wobei Name wie ‚%% aufruft‘
SQL> /
NAME WERT
—————————————————————- ———-
anrufe an kcmgcs 427
Anrufe an kcmgrs 0
Anrufe an kcmgas 7272
Aufrufe zum Abrufen des Snapshot-SCN: kcmgss 159790
SQL>
|
Geben wir eine Abfrage aus, um den aktuellen SCN in Sitzung 1 anzuzeigen:
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 ist das Ergebnis der zweiten Sitzung 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQLS> /
NAME WERT
—————————————————————- ———-
anrufe an kcmgcs 427
Anrufe an kcmgrs 0
Anrufe an kcmgas 7272
Anrufe zum Abrufen des Snapshot-SCN: kcmgss 159790
SQL> /
NAME WERT
—————————————————————- ———-
aufrufe an kcmgcs 427
Aufrufe an kcmgrs 0
Aufrufe an kcmgas 7278
Aufrufe zum Abrufen eines Snapshots SCN: kcmgss 159905
SQL>
|
Wir können sehen, dass die Aufrufe an die KCMGAS vom letzten Wert 7272 auf 7278 gestiegen sind. Da Oracle keine Sequenz verwendet, um die Anzahl zu erhöhen, gibt es keine Garantie dafür, dass die SCN-Nummer immer in derselben Reihenfolge erhöht wird.
Fazit
In diesem Artikel haben wir uns angesehen, was der SCN ist, wie er angezeigt wird und welche Anforderungen daran gestellt werden. Im nächsten Artikel werden wir sehen, welche verschiedenen Arten von SCNs verfügbar sind und wie sie in der Datenbank verwendet werden. Bleiben Sie dran!