Oracle Data-Pump

Data-Pump ist eine Infrastruktur von Oracle zum bewegen von Daten aus und in eine Datenbank. Es ersetzt die exp und imp Kommandos durch ihre Pendants expdp und impdp.

Der Import resp. Export erfolgt in einem Ordner der zuvor in Oracle definiert wird (dba_directories). In einer Standard Installation ist bereits ein Ordner vorgesehen (DATA_PUMP_DIR).

SELECT * FROM dba_directories;

owner

directory_name

directory_path

origin_con_id

SYS

DATA_PUMP_DIR

/opt/oracle/admin/ORCLCDB/dpdump/

1

Simpler Export

Ein einfacher Aufruf von expdp, bei dem der Benutzer foo seine Daten in dem Ordner DATA_PUMP_DIR sichert:

expdp foo@ORCLPDB \
    directory = DATA_PUMP_DIR \
    schemas   = foo \
    dumpfile  = "foo.dmp" \
    logfile   = "foo.log"

Export mit Flashback-Time

Über FLASHBACK_SCN und FLASHBACK_TIME kann ein bestimmter Zeitpunk der DB exportiert werden. Die System-Change-Number (SCN) ist eindeutig und über die ganze DB hinweg konsistent. Jede Änderung an der DB erhöht die SCN

SELECT dbms_flashback.get_system_change_number as SCN FROM dual;

        SCN
-----------
    3518491

Diese Nummer kann einem Export Parameter namens FLASHBACK_SCN übergeben werden. Einfacher ist es jedoch wenn Oracle die SCN zu einem bestimmten Zeitpunkt selber ermittelt und wir nur den Zeitpunkt angeben müssen (das nennt sich dann Flashback-Time). Die aktuelle Zeit lässt sich mit dem SYSTIMESTAMP angeben:

expdp foo@ORCLPDB \
    directory=DATA_PUMP_DIR \
    schemas = foo \
    flashback_time = SYSTIMESTAMP \
    dumpfile = "foo_$(date +%Y.%m.%d-%H.%M.%S).dmp" \
    logfile  = "foo_$(date +%Y.%m.%d-%H.%M.%S).log"

Import

Der Import des Data-Pump erfolgt mit dem Kommando impdp. Die Import Parameter namens FROMUSER und TOUSER ordnen dem Schema aus dem DUMP einen DB-User zu. Alternativ kann auch die Option REMAP_SCHEMA verwendet werden. Sofern der DB-User (das Schema) in der DB Instanz noch nicht existiert muss er angelegt werden, siehe „Schema anlegen (CREATE USER)“. Folgend ein Beispiel für einen Import, bei dem das Schema bar in den DB-User foo importiert wird.

impdp foo@ORCLPDB \
    directory    = ORACLE_IMPEXP \
    remap_schema = bar:foo \
    dumpfile     = "bar.dmp" \
    logfile      = "bar2foo-import.log" \
    exclude      = statistics

Sofern man sich den Export in eine neue DB einspielt, kann man die Statistiken (und ggf. andere Metadaten) beim Export, oder hier beim Import auch ausschließen (EXCLUDE): Würde man den Parameter weglassen, so könnte es zu Fehlermeldungen beim Import der Statistiken kommen: Objekttyp INDEX_STATISTICS konnte nicht erstellt werden …

Bemerkung

Nach dem Import können die Statistiken neu erzeugt werden, siehe DBMS_STAT Prozeduren: GATHET_xxx_STATS.

Falls beim Import Probleme mit dem Festplattenplatz auf der Datenbank auftauchen kann man u.U. auch erst mal das Archivlog aufräumen:

rman target /
backup archivelog all;
delete archivelog all;

dba_directories

Die Ordner des Data-Pump werden (wie alle) in der Tabelle dba_directories verwaltet und mit CREATE DIRECTORY angelegt (siehe auch Understanding Dump, Log, and SQL File Default Locations). Einrichten eines Ordners auf dem DB Host:

oracle@dbhost $ sudo -H mkdir -p /HOST/share/oracle_impexp
oracle@dbhost $ sudo -H chown -R oracle:oinstall /HOST/share/oracle_impexp

Als sysdba anmelden und den Ordner in der Oracle Instanz einrichten. Bei PDBs muss man noch in den Container wechseln und die Zugriffsrechte explizit für jeden DB-Usern in jedem Container vergeben.

ALTER SESSION SET container=ORCLPDB;

-- create directory object
CREATE OR REPLACE DIRECTORY oracle_impexp AS '/HOST/share/oracle_impexp';

-- grant read / write rights to schema
GRANT read, write ON DIRECTORY oracle_impexp TO foo;

Damit der Benutzer c##foo auf den Ordner zugreifen kann wurden ihm noch die dazu erforderlichen Rechte eingeräumt. Auf welche Ordner ein DB User Zugriff hat kann er über ermitteln:

SELECT * FROM ALL_DIRECTORIES;