Samstag, 16. Februar 2013

Oracle Datapump Export mit konsistenten Daten und Zeitereise-Exports erzeugen

Beim klassichen Oracle Export Tool exp gibt es den Parameter CONSISTENT=YES um einen über alle Tabellen konsistenten Datenbank Export zu erhalten.

Dieser konsistente Export wird über die für Oracle ganz normale transaktionale Lesekonsistenz mittels UNDO bzw. Before-Images gelöst.

Zu beachten ist, dass man bei sehr großen bzw. lang laufenden die Undo Retention und den Undo Tablespace entsprechen groß bemisst.

Im neuen Datapump Export Tool expdp Tool ist es grundsätzlich auch möglich konsistente Exports zu erzeugen, man muss nur wissen wie es geht, da der native exdp-Syntax nicht selbsterklärend ist.
Datapump realisiert die Lesekonsistenz über die Oracle Flashback Features.
(Diese gehen zwar auch wieder auf Undo, heissen aber viel toller und haben eine eigene API und sind flexibler)

Mit dem Parameter FLASHBACK_TIME=SYSTIMESTAMP bringt man nun auch expdp dazu jede Datenzeile auf genau ein und den selben lesekonsisten Zeitpunkt zum Beginn des Exports zu beziehen

Beispiel:
expdp exdptst/exdptst dumpfile=expdptst.dmp logfile=expdptst.log directory=exp_dp_dir FLASHBACK_TIME=SYSTIMESTAMP

hier ein Full-Export mit der vollen Escape-Orgie wie man sie in der Realität benötigt:
 
expdp \"\/ as sysdba\" dumpfile=expdptst.dmp logfile=expdptst.log directory=exp_dp_dir full=yes FLASHBACK_TIME=\"TO_TIMESTAMP\(TO_CHAR\(SYSDATE,\'YYYY-MM-DD HH24:MI:SS\'\),\'YYYY-MM-DD HH24:MI:SS\'\)\"


Das Escapen ist notwendig, damit die Shell nicht Zeichen selbständig interpretiert.
Der etwas umständliche Syntax mit TO_TIMESTAMP(TO_CHAR(SYSDATE... verhindert, dass die jeweiligen NLS-Einstellungen eine Ausführung verhindern.

Nun kann man das ganze auch einfacher haben, indem man die im relativ neuen Kompatibilitätsmodus wieder CONSISTENT=YES nutzt, was intern auf FLASHBACK_SCN zum Startzeitpunkt des Backups umgewandelt wird.
Das ist aber nicht der native Syntax und funktioniert mit den ersten Versionen von Datapump noch nicht.

Jetzt kommt der eigentlich spannende Teil!

Man kann selbstverständlich nicht nur SYSTIMESTAMP als Wert angeben, sondern jeden beliebigen gültigen Flashback-Zeitpunkt und somit Daten auch aus der Vergangenheit exportieren - sehr praktisch, wenn man Daten retten will.

Auch hier gilt wieder: man muss genug Undo Retention und Tablespace eingestellt haben.

Beispiel:
expdp exdptst/exdptst dumpfile=expdptst2.dmp logfile=expdptst.log directory=EXPDP_TEST_DIR flashback_time=\"TO_TIMESTAMP\(\'2013-02-08 15:50:00\', \'YYYY-MM-DD HH24:MI:SS\'\)\"

Die vielen Backslashes sind dem Escap-Syntax der der Shell geschuldet, die gerne die Zeichen die für sie ansonsten eine Bedeutung haben escaped haben will.

Als Belohnung bekommt man:

Export: Release 11.2.0.2.0 - Production on Fri Feb 8 21:09:14 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "EXDPTST"."SYS_EXPORT_SCHEMA_01":  exdptst/******** dumpfile=expdptst2.dmp logfile=expdptst.log directory=EXPDP_TEST_DIR flashback_time="TO_TIMESTAMP('2013-02-08 15:50:00', 'YYYY-MM-DD HH24:MI:SS')"
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
. . exported "EXDPTST"."EXDPTST"                             0 KB       0 rows
Master table "EXDPTST"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for EXDPTST.SYS_EXPORT_SCHEMA_01 is:
  /export/home/oracle/expdptst2.dmp
Job "EXDPTST"."SYS_EXPORT_SCHEMA_01" successfully completed at 21:09:53




Daten wurden aus der Vergangenheit exportiert (im Testcase absichtlich leer).

Als Geschwister Parameter von FLASHBACK_TIME gibt es auch noch
FLASHBACK_SCN, hier kann man eine gültige SCN angeben auf die sich das Flashback bezieht - intern wird sowieso jede Zeit in eine SCN umgewandelt.

PS:
Die Meldung
FLASHBACK automatically enabled to preserve database integrity
darf im im Übrigen nicht so interpretiert werden, dass man nun automatisch einen konsistenten Export erhält. Sie ist nur ein Hinweis, dass für manche Tabellen spezielle SCNs für Replikationszwecke eingebaut werden.
Das hat aber nichts mit dem oben beschriebenen konsistenten Backup zu tun.
Siehe auch MOS-Note "Expdp Message "FLASHBACK automatically enabled" Does Not Guarantee Export Consistency [ID 377218.1]"