Oracle DataPump hat sich bei vielen Anwendern aufgrund seiner Vorteile als Import/Export-Werkzeug durchgesetzt. Neben den Werkzeugen impdp und expdp lässt sich die DataPump auch via PL/SQL steuern. Hierzu dient das Package DBMS_DATAPUMP. Die Verwendung für einen Schema-Export zeigt folgendes Beispiel:
DECLARE v_DPHandle_n NUMBER; v_TimeStamp_vc VARCHAR2(15); v_JobName_vc VARCHAR2(30); v_DumpFilename_vc VARCHAR2(50); v_LogFilename_vc VARCHAR2(50); v_JobStatus_vc VARCHAR2(50); v_SchemaName_vc VARCHAR2(8) := 'SCOTT'; -- dieses Oracle-Verzeichnis muss evtl. vorher angelegt werden -- -- CREATE OR REPLACE DIRECTORY DPUMP_TEST_DIR AS '/tmp'; -- -- evtl. muessen auch Schreib-/Lese-Rechte gesetzt werden -- -- GRANT READ, WRITE ON DIRECTORY DPUMP_TEST_DIR TO orauser; -- v_DumpDir_vc VARCHAR2(20) := 'DPUMP_TEST_DIR'; BEGIN v_TimeStamp_vc := TO_CHAR(sysdate, 'YYYYMMDD-HH24MISS'); v_JobName_vc := v_TimeStamp_vc || '_' || v_SchemaName_vc; -- wichtig ist der Platzhalter %U, je nach Parallelitaet werden so -- mehrere Dump-Files erzeugt v_DumpFilename_vc := v_SchemaName_vc || '_' || v_TimeStamp_vc || '_%U.dmp'; v_LogFilename_vc := v_SchemaName_vc || '_' || v_TimeStamp_vc || '.log'; -- Datapump-Job oeffnen v_DPHandle_n := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name => v_JobName_vc ); -- Dump-File fuer den Job definieren DBMS_DATAPUMP.add_file( handle => v_DPHandle_n, filename => v_DumpFilename_vc, directory => v_DumpDir_vc ); -- Log-File definieren DBMS_DATAPUMP.add_file( handle => v_DPHandle_n, filename => v_LogFilename_vc, directory => v_DumpDir_vc, filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE ); -- welches Schema soll exportiert werden? DBMS_DATAPUMP.metadata_filter( handle => v_DPHandle_n, name => 'SCHEMA_EXPR', value => '= ''' || v_SchemaName_vc || '''' ); -- Parallelitaet auf 4 setzen DBMS_DATAPUMP.SET_PARALLEL( handle => v_DPHandle_n, degree => 4 ); -- eigene Eintraege im Log-File sind moeglich DBMS_DATAPUMP.LOG_ENTRY( handle => v_DPHandle_n, message => '---> Schema Export via PL/SQL' ); -- Job starten DBMS_DATAPUMP.start_job(v_DPHandle_n); -- auf das Job Ende wird normalerweise nicht gewartet -- mit WAIT_FOR_JOB laesst sich dies aber bei Bedarf -- realisieren DBMS_DATAPUMP.WAIT_FOR_JOB( handle => v_DPHandle_n, job_state => v_JobStatus_vc ); END; /
Ein allgemeiner Hinweis zu Oracle DataPump:
DataPump-Prozesse laufen immer auf dem Oracle-Server!
Dies hat in der Praxis folgende Auswirkungen:
- Der Betriebssystem-Benutzer, dem die Oracle-Server Prozesse zugeordnet sind, braucht Schreib-Rechte auf dem gewünschten Export-Verzeichnis (läuft die Datenbank-Instanz als Windows-Dienst und dem Benutzer LocalSystem ist kein Schreiben auf Netzwerk-Shares möglich, da dieser Benutzer keine Netzwerk-Shares sieht)
- Es gibt keinen Client-/Server-Modus (z.B. Export eines Schemas von einem entfernten Oracle Server über einen lokalen Oracle Client)