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)