Duplizieren eines Oracle-Schemas mit Datapump
Sie möchten einen Datenbank-Benutzer inklusive seiner Objekte und Daten kopieren? Verwendet man Oracle Export / Import für das Kopieren eines Datenbank-Benutzers, so wird zunächst eine Datei ins Dateisystem geschrieben, die anschließend in ein neues Schema importiert wird. Ein Beispiel finden Sie
hier.
Ab Oracle Database 10g Release 1 ist der Zwischenschritt über den Export in eine Datei nicht mehr erforderlich. Mit Oracle Data Pump kann über einen Datenbank Link ein Schema einer anderen Datenbank in die eigene importiert werden. Diese Technik können Sie auch nutzen, um innerhalb derselben Datenbank ein Schema zu kopieren. Dazu erstellen Sie einen Loopback Database Link, der auf die eigene Datenbank verweist. Die Prozedur lehnt sich im Wesentlichen an die von
Christopher Poole beschriebene an.
Zunächst erstellen Sie einen Datenbank Link:
-- Erstellen des Loopback Database Link CREATE DATABASE LINK "LOOPBACK.WORLD" USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=mein_service_name)))';
Achten Sie darauf, dass Sie den Parameter service_name beim Erstellen des Database Links anpassen. Testen Sie Ihren Datenbank Link vorab nochmals, indem Sie eine Abfrage wie
SELECT *
FROM all_tables@loopback.world
WHERE rownum <= 10;
absetzen. Hier darf keine Fehlermeldung auftreten.
Ist der Schalter global_names Ihrer Datenbank auf TRUE gesetzt, so tritt etwa folgende Fehlermeldung auf:
ORA-02085: database link LOOPBACK.WORLD connects to HO_DB.WORLD
In diesem Fall ist es erforderlich, dass der Name des Datenbank Links dem der Datenbank entspricht. Ein Beispiel:
CREATE DATABASE LINK "HO_DB.WORLD@loopback" USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=HO_DB.WORLD.world)))'
Die Prüfung der Funktionsfähigkeit des Datenbank Links erfolgt dann entsprechend mit
SELECT *
FROM all_tables@HO_DB.WORLD@loopback
WHERE rownum <= 10;
Funktioniert der Datenbank Link, kann die Prozedur implementiert werden. Der Benutzer, unter dessen Namen die Prozedur implementiert wird, benötigt Ausführungsrechte auf die Datenbank-Packages dbms_datapump und dbms_flashback sowie das Prigvileg alter user. Auf Letzteres kann dann verzichtet werden, wenn Codezeile 50 ff. (Ändern des Kennwortes des neu erstellten Benutzers) entfernt oder auskommentiert wird.
CREATE OR REPLACE PROCEDURE kopiere_schema ( i_quell_schema IN VARCHAR2, i_ziel_schema IN VARCHAR2, i_neues_passwort IN VARCHAR2, i_database_link IN VARCHAR2 DEFAULT 'loopback.world' ) AS -- Job Handle l_job_handle NUMBER; -- Job Status l_job_status user_datapump_jobs.state%TYPE; -- Single Quote quote VARCHAR2(1) := chr(39); BEGIN -- Erstellen eines Import-Jobs l_job_handle := dbms_datapump.open ( 'IMPORT', 'SCHEMA', i_database_link); -- Um konsistent zu kopieren, wird die aktuelle -- System Change Number ermittelt und geesetzt dbms_datapump.set_parameter ( l_job_handle, 'FLASHBACK_SCN', dbms_flashback.get_system_change_number); -- Einschraenkung auf das zu kopierende Schema dbms_datapump.metadata_filter ( l_job_handle, 'SCHEMA_LIST', quote || i_quell_schema || quote); -- Remapping auf das neue Schema dbms_datapump.metadata_remap( l_job_handle, 'REMAP_SCHEMA', i_quell_schema, i_ziel_schema); -- Start des Jobs dbms_datapump.start_job(l_job_handle); -- Auf Ausfuehrungsende warten dbms_datapump.wait_for_job(l_job_handle, l_job_status); -- Aendern des Passwortes fuer den neuen Schema-Benutzer EXECUTE IMMEDIATE ' ALTER USER '|| i_ziel_schema|| ' IDENTIFIED BY '|| i_neues_passwort; END; /
Der Aufruf der Prozedur kann nun wie folgt aussehen:
BEGIN kopiere_schema ('SCOTT', 'noch_ein_scott', 'tricksi'); END; /
held-informatik
de
info