Tipps & Tricks: Juli 2004 Bereich: DBA, PL/SQL Erstellung: 06/2004 MP Versionsinfo: 10.1,10.2, 11.1, 11.2 Letzte Überarbeitung: 06/2009 MP Datapump Package Neues Package für Export/Import in Oracle 10g (dbms_datapump) Die Oracle Version 10g hat die Export/Import Utilities komplett erneuert. Es werden zwar aus Kompatibilitätsgründen noch die beiden alten Tools EXP und IMP ausgeliefert, aber wohl nicht mehr lange unterstützt. 1. Was bringt nun die neue Schnittstelle Höhere Geschwindigkeit (Export bis zu 60% schneller, Import ca. 15 mal schneller!) Viel mehr Optionen (z.B. Exclude und Include Listen) und eine API in Form eines Package (dbms_datapump) Da diese Schnittstelle im Internet noch nicht besonders gut dokumentiert ist, wollen wir hier näher darauf eingehen: 2. Stolperfallen In der Oracle Dokumentation Version 10.1 sind leider einige Fehler versteckt, die einem das Leben schwer machen. Darüber hinaus sind die Fehlermeldungen des Package mehr als dürftig. Bei der OPEN Procedure heißt der Parameter job_mode und nicht mode ! Bei der METADATA_FILTER Procedure heiß der Parameter NAME_EXPR und nicht INCLUDE_NAME_EXPR Beim Export darf die Datei nicht existieren, in die exportiert werden soll, sonst bekommt man folgende Fehlermeldung: ORA-39001: Ungültiger Argumentwert Hinweis: Ab Version 11.1 kann der Parameter REUSE_DUMPFILES=Y das Problem lösen. Der Shared Pool sollte größer als 60M sein, sonst kann es ein Speicherfehler geben: ORA-00604: Fehler auf rekursiver SQL-Ebene 2 ORA-04031: 4096 Byte des Shared Memorys konnten nicht zugewiesen werden ("shared pool","select pos#,intcol#,col#,spa...","Typecheck ORA-06508: PL/SQL: aufgerufene Programm-Einheit ist nicht zu finden Sie sollten auch nicht als SYS das Package aufrufen sonst gibt es diese Fehlermeldung: FLASHBACK automatisch aktiviert, um Datenbankintegrität aufrechtzuerhalten. ORA-39135: SYS-Schema kann keine Daten mit spezifischen SCNs lesen Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 4 Wenn ein fehlerhafter Export bereits zuvor gelaufen ist, kann es nötig sein, sich erneut anzumelden !!! und dann die Verwaltungstabelle des Exports zu löschen. Der Name der Tabelle entspricht dem Export-Job-Namen ( im unteren Beispiel EMP_EXPORT) Informationen über noch laufende Prozesse finden Sie in der Verwaltungsview: DBA_DATAPUMP_JOBS Export und Import arbeiten nur mit Directories zusammen und nicht mit UTL_FILE_DIR ! Sowohl Export als auch Import erfolgen asynchron. Das heisst, die dbms_datapump Routinen sind bereits fertig, dann startet erst der eigentliche Vorgang. Sie können jedoch nach dem erfolgreichen Beenden der Routinen, Ihre Session beenden, die Aufgabe liegt deswegen trotzdem weiterhin in AQ-Tabellen. Wenn man diese Klippen umschifft hat kann man mit dem Export beginnen... 3. Beispiel-Skript für Tabellen-Export: Anmelden an der DB: CONNECT system/manager Verzeichnisse erstellen: HOST mkdir C:\oracle\expimp HOST mkdir C:\oracle\expimp\logs Directory Einträge anlegen: CREATE OR REPLACE DIRECTORY expimp AS 'C:\oracle\expimp'; CREATE OR REPLACE DIRECTORY expimp_log AS 'C:\oracle\expimp\logs'; Rechte vergeben: GRANT READ,WRITE ON DIRECTORY expimp TO system; Alte Exportdatei(falls vorhanden) löschen: HOST del C:\oracle\expimp\myexp*.dmp Alte EXPORT-Verwaltungstabelle löschen sonst kann Job nicht neu angelegt werden: DROP TABLE system.emp_export; SET SERVEROUTPUT ON SIZE 1000000 DECLARE p_dph NUMBER; Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 4 BEGIN p_dph := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'TABLE',job_name =>'EMP_EXPORT'); DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'MYEXP%U.DMP',directory => 'EXPIMP',filetype=>1); DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'EXP.LOG',directory => 'EXPIMP_LOG',filetype=>3); DBMS_DATAPUMP.metadata_filter(handle => p_dph,name=>'SCHEMA_EXPR',value =>'IN (''SCOTT'')'); DBMS_DATAPUMP.metadata_filter(handle => p_dph,name=>'NAME_EXPR',value =>'IN (''EMP'')'); DBMS_DATAPUMP.start_job(p_dph); DBMS_DATAPUMP.detach(p_dph); dbms_output.put_line('Export erfolgreich beendet'); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Fehler:'||sqlerrm||' bei Job-ID:'||p_dph); END; / 4. Beispiel-Skript für Tabellen-Import : CONNECT SYSTEM/MANAGER VARIABLE ret NUMBER SET SERVEROUTPUT ON SIZE 1000000 DECLARE p_dph NUMBER; BEGIN p_dph := DBMS_DATAPUMP.open(operation=>'IMPORT',job_mode=>'TABLE',job_name =>'EMP_IMPORT'); DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'MARCO%U.DMP',directory => 'EXPIMP',filetype=>1); DBMS_DATAPUMP.add_file(handle=>p_dph,filename=>'MARCO_IMP.LOG',directory => 'EXPIMP_LOG',filetype=>3); DBMS_DATAPUMP.set_parameter(handle=> p_dph,name=>'TABLE_EXISTS_ACTION',value =>'REPLACE'); DBMS_DATAPUMP.start_job(p_dph); DBMS_DATAPUMP.detach(p_dph); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Fehler:'||sqlerrm||' bei Job-ID:'||p_dph); END; / 5. Zusammenfassung Oracle hat den Anwender ein mächtiges Package mit an die Hand gegeben, aber leider nur dürftig dokumentiert. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 4 Man könnte hier viele Beispiele aufführen, aber dafür haben wir ja ausgiebig Zeit in unserem Backup & Recover Kurs :-). Dort werden wir uns hoffentlich alle wieder sehen .... Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 4 von 4