2014-03-27 11 views
7

Ich habe dies als Ergebnis der Abfrage:Wie Timestamp_to_scn und Scn_to_timestamp in Oracle verwenden?

select cast(to_date(a.start_time,'mm/dd/yyyy hh:mi:ss pm') as timestamp) date_of_call, 
ora_rowscn from calling_table a where rownum <= 10; 

     DATE_OF_CALLING   ORA_ROWSCN 

26-JUL-13 12.29.28.000000000 PM 8347567733892 
26-JUL-13 12.29.35.000000000 PM 8347567733892 
26-JUL-13 12.29.35.000000000 PM 8347567733892 
26-JUL-13 12.29.38.000000000 PM 8347567733892 
26-JUL-13 12.29.44.000000000 PM 8347567733892 
26-JUL-13 12.29.47.000000000 PM 8347567733892 
26-JUL-13 12.29.48.000000000 PM 8347567733892 
26-JUL-13 12.29.48.000000000 PM 8347567733892 
26-JUL-13 12.29.48.000000000 PM 8347567733892 
26-JUL-13 12.29.56.000000000 PM 8347567733892 

Aber wenn ich versuche, diese Zeitstempel in scn zu konvertieren die Funktion timestamp_to_scn verwenden, ich die folgende Störung erhalte:

ORA-08180: kein Snapshot basierend auf der angegebenen Zeit gefunden ORA-06512: bei "SYS.TIMESTAMP_TO_SCN", Zeile 1 08180. 00000 - "Kein Snapshot basierend auf der angegebenen Zeit gefunden" * Ursache: Die Zeit konnte nicht mit einem SCN vom Mapping abgeglichen werden Tabelle. * Aktion: versuchen Sie es mit einer größeren Zeit.

Und wenn ich scn_to_timestamp auf ora_rowscn bin mit dieser Spalte in einen Zeitstempel zu konvertieren, erhalte ich folgende Fehlermeldung:

ORA-08181: angegebene Nummer ist keine gültige Systemänderungsnummer ORA-06512: bei "SYS.SCN_TO_TIMESTAMP", Zeile 1 08181. 00000 - "angegebene Nummer ist keine gültige Systemänderungsnummer" * Ursache: gelieferte scn war außerhalb der Grenzen eines gültigen scn. * Aktion: Verwenden Sie eine gültige scn.

Was mache ich falsch?

Antwort

15

Sie versuchen, zu weit zurück zu schauen. Sie können nur zu und von SCNs konvertieren, die sich im Redo/Flashback-Fenster befinden, das von Ihrem System verwaltet wird. Sobald die Änderungen auslaufen, ist das Mapping verloren.

Dies ist erklärt in the documentation:

The association between an SCN and a timestamp when the SCN is generated is remembered by the database for a limited period of time. This period is the maximum of the auto-tuned undo retention period, if the database runs in the Automatic Undo Management mode, and the retention times of all flashback archives in the database, but no less than 120 hours. The time for the association to become obsolete elapses only when the database is open. An error is returned if the SCN specified for the argument to SCN_TO_TIMESTAMP is too old.

Beachten Sie uns diese sind Teil der Oracle-internen Mechanismus, und so sind von begrenztem Nutzen; obwohl sie für Flashback-Abfragen natürlich nützlich sind - wieder im selben Fenster.

+0

Vielen Dank @Alex. :) – MontyPython

2

Setzen Sie UNDO_MANAGEMENT auf AUTO und UNDO_RETENTION auf den Wert, der den Zeitraum Ihrer längsten Abfrage in der Zeit abdeckt. Setzen Sie auch RETENTION GARANTEE, um zu verhindern, dass UNDO überschrieben wird.

Für Oracle 10g können Sie nicht länger als 5 Tage Flashback. Dies ist ein hart codiertes Limit. Für Oracle 11g gibt es keine Einschränkung.