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:
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:
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;
/
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.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.