DATAPUMP – Daten Import / Export mittels impdp – expdp
In diesem Post zeige ich grundlegend wie Daten mittels DATAPUMP exportieren (expdp) und in ein anderes DB-Schema mittels impdp importiert werden können.
Dabei wird in diesem Anwendungsbeispiel der Einsatz von REMAP_SCHEMA, QUERY, TABLES sowie TABLE_EXISTS_ACTION Parameter des DATAPUMPs dargestellt.
Grundvoraussetzungen – Database Directory
Grundvoraussetzung für den Export bzw. Import ist ein Oracle Directory mit entsprechenden Schreibberechtigungen auf dem DB-Host.
1 2 3 4 5 6 7 8 9 |
-- als system in SQLPlus einloggen sqlplus system/PWD -- Directory erstellen CREATE OR REPLACE DIRECTORY TESTDATA_DIR AS '/tmp'; -- Eine Rechtevergabe ist hier nicht notwendig, -- da der Export durch den DB-User SYSTEM ausgeführt wird! -- GRANT READ,WRITE ON DIRECTORY TESTDATA_DIR TO ???; |
Beispiel Datenexport – expdp
In diesem Beispiel werden aus der Datenbank alle Daten der TABELLE1 und TABELLE2 aus dem DB-Schema USER_BESSERDICH und Daten der TABELLE3 aus dem DB-Schema USER_KARSTEN mit der ID 1,2 und 3 exportiert. Der fertige Datendump wird dann in das Oracle Directory TESTDATA_DIR abgelegt, also auf dem DB-Host unter /tmp/export_testdata.dmp .
1 2 3 4 5 6 7 |
expdp system/pwd \ DIRECTORY=TESTDATA_DIR \ CONTENT=DATA_ONLY \ LOGFILE=export_testdata.log \ DUMPFILE=export_testdata.dmp \ TABLES=USER_BESSERDICH.TABELLE1,USER_BESSERDICH.TABELLE2,USER_KARSTEN.TABELLE3 \ QUERY=USER_KARSTEN.TABELLE3:"WHERE ID IN(1,2,3)" |
Beispiel Datenimport – impdp
Nun kann der Dump – also die Datei export_testdata.dmp – auf einen anderen DB-Host kopiert oder auf der gleichen Datenbank in andere Schemata importiert werden.
In diesem Beispiel werden die Daten von zwei Schemata (USER_KARSTEN und USER_BESSERDICH) in ein anderes Schema – NEW_USER – importiert und entsprechend gemappt. Grundvoraussetzung ist natürlich, dass die Tabellenstrukturen der 3 Tabellen auf dem Zielschema vorhanden ist!
Sofern in der Zielstruktur Daten vorhanden sind, werden diese gelöscht – wird durch den Befehl TABLE_EXISTS_ACTION initiiert.
1 2 3 4 5 6 7 8 |
impdp system/pwd \ DIRECTORY=TESTDATA_DIR \ DUMPFILE=export_testdata.dmp \ LOGFILE=export_testdata.log \ REMAP_SCHEMA=USER_BESSERDICH:NEW_USER \ REMAP_SCHEMA=USER_KARSTEN:NEW_USER \ CONTENT=DATA_ONLY \ TABLE_EXISTS_ACTION=TRUNCATE |
Problematik – ForeignKeys
Wenn Tabellen Abhängigkeiten in Form von Foreign Keys aufweisen, wird das Importieren der Daten auf einen Fehler laufen. Ich weiß leider nicht warum der DATAPUMP keine Option besitzt die vorhanden ForeignKeys während des Importes zu deaktivern – jedenfalls führe ich grundsätzlich folgende Statements – am Besten in separate SQL-Plus Scripte auslagern – aus.
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 31 32 33 34 35 36 37 38 |
-- das Script unter dem USER - NEW_USER - ausführen sqlplus NEW_USER -- Ausschalten der ForeignKeys aus Zielschema BEGIN FOR REC IN ( SELECT * FROM USER_CONSTRAINTS UC WHERE 1=1 AND UC.CONSTRAINT_TYPE = 'R' AND STATUS = 'ENABLED' AND CONSTRAINT_NAME NOT LIKE 'SYS%' ) LOOP EXECUTE IMMEDIATE 'ALTER TABLE ' || REC.TABLE_NAME || ' DISABLE CONSTRAINT ' || REC.CONSTRAINT_NAME; END LOOP; END; / .. nun den IMPORT ausführen -- Einschalten der ForeignKeys aus Zielschema BEGIN FOR REC IN ( SELECT * FROM USER_CONSTRAINTS UC WHERE 1=1 AND UC.CONSTRAINT_TYPE = 'R' AND STATUS = 'DISABLED' AND CONSTRAINT_NAME NOT LIKE 'SYS%' ) LOOP EXECUTE IMMEDIATE 'ALTER TABLE ' || REC.TABLE_NAME || ' ENABLE CONSTRAINT ' || REC.CONSTRAINT_NAME; END LOOP; END; / |
Sollten sich ForeignKeys nicht einschalten lassen, so liegt ein Datenschiefstand vor, d.h. die Daten passen nicht zueinander.
4 KOMMENTARE



