Tipps & Tricks: März 2009 Bereich: DBA, PL/SQL, SQL Erstellung: 03/2009 MM Versionsinfo: getestet mit 10.2.0.4, 11.1.0.6 Letzte Überarbeitung: 05/2009 MM DBMS_FILE_TRANSFER zum Kopieren von Binär-Dateien Sie wollten schon häufiger Datenbankdateien von einem Server A auf den Server B kopieren und waren aber gerade nicht in der Lage sich lokal mit einem der Server zu verbinden und anschließend den anderen zu mounten? Oder es war Ihnen schlichtweg zu umständlich? Dann haben wir hier vielleicht eine ganz praktische Lösung für Sie. Mit Version 10g stellt Oracle ein neues Package zur Verfügung, mit dessen Hilfe sich sehr einfach und komfortabel Binär-Dateien zwischen Datenbank-Servern kopieren lassen. DBMS_FILE_TRANSFER als API unterstützt die folgenden drei Prozeduren: COPY_FILE GET_FILE PUT_FILE Nützliches rund um DBMS_FILE_TRANSFER Für einen erfolgreichen Kopiervorgang mittels DBMS_FILE_TRANSFER müssen Sie sich folgende Punkte bewusst machen: Sowohl die Quell-Datenbank, als auch die Ziel-Datenbank müssen sich in der OPEN-Phase befinden. Der Oracle Benutzer benötigt das Leserecht auf das Quellverzeichnis und das Schreibrecht auf das Zielverzeichnis. Die Größe der zu kopierenden Dateien muss einem Vielfachen von 512 Bytes entsprechen und darf höchstens zwei Terabytes betragen. Kopiervorgänge großer Dateien können in der View V$SESSION_LONGOPS überwacht werden. Die zu verwendenden Directories für Quell- und Zielverzeichnis müssen bereits existieren, während die Datei im Zielverzeichnis noch nicht bestehen darf. COPY_FILE Mit der COPY_FILE-Prozedur kopieren Sie eine Binär-Datei innerhalb desselben Servers. Dabei kann sich sowohl das Quellverzeichnis wie auch das Zielverzeichnis entweder im lokalen Dateisystem oder auf einer ASM Disk Group befinden. Soll eine Datei innerhalb des lokalen Dateisystems kopiert werden, kann es sich um eine beliebige Binär-Datei handeln. Stellt eines der Verzeichnisse eine ASM Disk Group dar, können nur Datenbank relevante Dateien kopiert werden, wie z.B. Daten-, Control- oder Logdateien. Beispiel: Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 3 Die Datendatei USERS01.DBF soll kopiert werden. Dazu ist es empfehlenswert, den Tablespace OFFLINE oder READ ONLY zu setzen, damit während des Kopiervorgangs keinerlei Änderungen an der Datei vorgenommen werden können. CREATE OR REPLACE DIRECTORY db_source_dir AS 'c:\oracle\product\oradata\o10g'; CREATE OR REPLACE DIRECTORY db_target_dir AS 'e:\oracle\oradata\o10g'; ALTER TABLESPACE users READ ONLY; BEGIN DBMS_FILE_TRANSFER.COPY_FILE ( source_directory_object => 'DB_SOURCE_DIR', source_file_name => 'USERS01.DBF', destination_directory_object => 'DB_TARGET_DIR', destination_file_name => 'USERS01.DBF'); END; / ALTER TABLESPACE users READ WRITE; GET_FILE Die GET_FILE-Prozedur ermöglicht es Ihnen, eine Binär-Datei von einem remote Server ins lokale Dateisystem oder auf eine ASM Disk Group zu kopieren. Dazu muss ein Database Link zur remote (Quell-)Datenbank vorhanden sein bzw. erzeugt werden (an den Eintrag in der TNSNAMES.ORA denken, falls Sie nicht mit Easy Connect arbeiten). Beispiel: Die Exportdatei EXPDAT.DMP soll von einem remote Rechner ins lokale Dateisystem kopiert werden. In der remote Datenbank wird zunächst das Directory für das Quellverzeichnis erzeugt. CONNECT system@<remote_db> CREATE OR REPLACE DIRECTORY db_source_dir AS 'c:\oracle\admin\o10g\dpdump'; CONNECT system@<lokal_db> CREATE OR REPLACE DIRECTORY db_target_dir AS 'c:\dpdump'; CREATE DATABASE LINK s01 CONNECT TO system IDENTIFIED BY <pwd> USING 's01'; BEGIN DBMS_FILE_TRANSFER.GET_FILE ( source_directory_object => 'DB_SOURCE_DIR', source_file_name => 'EXPDAT.DMP', source_database => 'S01', destination_directory_object => 'DB_TARGET_DIR', destination_file_name => 'EXPDAT.DMP'); END; / Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 3 PUT_FILE Als Gegenstück zu GET_FILE können Sie mit der PUT_FILE-Prozedur eine Binär-Datei vom lokalen Server (aus dem Dateisystem oder aus ASM) zu einem remote Server ins dortige Dateisystem kopieren. Dazu muss wieder ein Database Link zur remote (Ziel-) Datenbank vorhanden sein bzw. erzeugt werden (an den Eintrag in der TNSNAMES.ORA denken, falls Sie nicht mit Easy Connect arbeiten). Beispiel: Die über ASM verwaltete SPFILE-Datei soll vom lokalen Rechner ins remote Dateisystem kopiert werden. In der remote Datenbank wird wie gehabt - das Directory für das Zielverzeichnis erzeugt. CONNECT system@<remote_db> CREATE OR REPLACE DIRECTORY db_target_dir AS 'c:\oracle\product\10.2.0\db_1\database'; CONNECT system@<lokal_db> CREATE OR REPLACE DIRECTORY db_source_dir AS '+DG1/myasm'; CREATE DATABASE LINK s01 CONNECT TO system IDENTIFIED BY <pwd> USING 's01'; BEGIN DBMS_FILE_TRANSFER.PUT_FILE ( source_directory_object => 'DB_SOURCE_DIR', source_file_name => 'spfilemyasm.ora', destination_directory_object => 'DB_TARGET_DIR', destination_file_name => 'spfile.ora', destination_database => 'S01'); END; / Abschlussbemerkung Natürlich müssen Sie einiges an Vorarbeit leisten, damit DBMS_FILE_TRANSFER genutzt werden kann. Haben Sie sich aber erst einmal die Directories und Database Links erzeugt sowie die notwendigen Berechtigungen vergeben, ist der Aufruf eine erfreulich unkomplizierte Geschichte. Besonders die Möglichkeit auch ASM Disk Groups sowohl als Quell- wie auch als Zielverzeichnis ansprechen zu können, macht das Package sehr nützlich. Bedenken Sie, dass DBMS_FILE_TRANSFER keine Umlaute in Dateinamen unterstützt und nur für Datenbanken, die sich in der OPEN-Phase befinden nutzbar ist. Das Package sollte nicht zum Erzeugen von Online Backups genutzt werden, da während des Kopiervorgangs Inkonsistenzen entstehen können. Diese können zwar in Verbindung mit den archivierten Redo-Log-Dateien wieder bereinigt werden, jedoch wird empfohlen, die Dateien vor dem Kopieren OFFLINE oder wenigstens auf READ ONLY zu setzen. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 3