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;