2017-12-31 112 views
1

Kann ich auf der Oracle SCN verlassen Spur von geänderten Zeilen in der Datenbank zu halten? Ziel ist es, die Datenbank alle x Minuten für alle Zeilen abzufragen, die in einer bestimmten Tabelle geändert wurden. Die Idee war, die aktuelle SCN zu erinnern, mitMit der Oracle SCN verfolgen geänderten Zeilen

SELECT current_scn FROM V$DATABASE; 

Und dann nach x Minuten würde ich nur eine Abfrage wie

SELECT * from mytable where ORA_ROWSCN > current_scn_x_minutes_ago; 

alle Zeilen zu bekommen laufen, die sich seitdem geändert haben (und haben somit ein höhere SCN). Ich bin mir bewusst, dass die Abfrage zu viele Ergebnisse zurückgibt, da die SCNs pro Block verwaltet werden, aber das spielt keine Rolle. Die Hauptfrage, die ich habe, ist, ob der SCN streng zunimmt, dh ob der nächste erzeugte SCN immer höher ist als der aktuelle SCN (wie von V $ DATABASE abgefragt) oder ob ich auf SCN_TO_TIMESTAMP angewiesen bin, um sicher zu sein, dass die Reihenfolge ist richtig.

Antwort

3

Die wichtigste Frage die ich habe ist, ob der SCN streng nimmt, dh, ob der nächste erzeugte SCN ist immer höher als die aktuellen SCN

Nach der Dokumentation: ORA_ROWSCN Pseudocolumn

auf Blockebene oder auf Zeilenebene

Ob sollte die ORA_ROWSCN nicht als eine exakte SCN betrachtet werden. Zum Beispiel, wenn eine Transaktion Reihe R in einem Block geändert und engagiert bei SCN 10, ist es nicht immer wahr, dass die ORA_ROWSCN für die Zeile 10. Während ein Wert zurückgeben würde weniger als 10 würde nie mehr jeder Wert zurückgegeben werden als oder gleich bis 10 zurückgegeben werden konnte. Das heißt, das ORA_ROWSCN einer Zeile ist nicht immer , garantiert immer das genaue Commit-SCN der Transaktion, die diese Zeile zuletzt geändert hat. Mit feinkörnigen ORA_ROWSCN, wenn zwei Transaktionen T1 und T2 die gleiche Zeile R nacheinander geändert und festgeschrieben, eine Abfrage auf die ORA_ROWSCN der Zeile R nach dem Festschreiben von T1 wird einen Wert niedriger als zurückgegeben der nach dem Festschreiben von T2 zurückgegebene Wert.

Wenn ein Block zweimal abgefragt wird, dann ist es möglich, den Wert von ORA_ROWSCN zwischen den Abfragen zu ändern, auch wenn Zeilen nicht in der Zeit zwischen den Abfragen aktualisiert. Die einzige Garantie ist , dass der Wert von ORA_ROWSCN in beiden Abfragen größer ist als der SCN der Transaktion verpflichten, die zuletzt die Zeile modifiziert.

+0

Danke für die Antwort. Wir verwenden kein feinkörniges ORA_ROWSCN (unter Verwendung von ROWDEPENDENCIES) und können unsere Tabellen nicht mit dieser Einstellung neu erstellen. So ist die Frage, ob das genannte Regel auf Blockebene gilt auch, oder es anders ausdrücken: „Wenn Transaktion T1 modifiziert Reihe R1 B1 und Transaktion T2 ändert Reihe R2 gehör B2 zu blockieren, und T2 passiert nach T1 Block gehört, ist ORA_ROWSCN von R1, nachdem das Commit von T1 nach dem Commit von T2 garantiert niedriger als ORA_ROWSCN von R2 ist (vorausgesetzt, wir verwenden kein feingranulares ORA_ROWSCN)? " –

Verwandte Themen