Dateien mit der Oracle Datenbank kopieren (DBMS_FILE_TRANSFER)
von Ralf Durben, ORACLE Deutschland B.V. & Co. KG
Seit Oracle Database 10g Release 1 gibt es das sehr hilfreiche PL/SQL-Package DBMS_FILE_TRANSFER. Mit diesem Package kann die Datenbank Dateien innerhalb des Datenbankservers oder auch von Datenbankserver zu Datenbankserver kopieren. Damit können Sie als Datenbankbenutzer, ohne sich auf Betriebssystem-Ebene anzumelden, physikalische Kopien von Dateien erstellen. Das funktioniert sowohl für Dateisysteme als auch für ASM und kann sehr sinnvoll sein, zum Beispiel im Rahmen von automatisierten Batch-Vorgängen.
Anwendungsbereiche
VorgehensweiseDas Package DBMS_FILE_TRANSFER besteht aus drei Prozeduren:
COPY_FILEMit COPY_FILE können Dateien auf einem Datenbankserver kopiert werden. Dabei müssen Quell- und Zielverzeichnis als DIRECTORY in dieser Datenbank definiert sein. Auch muß das Leserecht für das Quellverzeichnis und das Schreibrecht für das Zielverzeichnis vorher vergeben worden sein. Die ersten beiden Parameter dieser Prozedur geben das Quellverzeichnis, sowie die Quelldatei, der dritte und vierte Parameter das Zielverzeichnis sowie die Zieldatei an.Beispiel 1 In diesem Beispiel wird eine Dump-Datei (von Data Pump) aus dem Verzeichnis "Q" in das Verzeichnis "Z" kopiert. Das Kopieren wird dabei von dem Datenbankbenutzer "ralf" durchgeführt, der zu Beginn dieses Beispiels nur das Datenbankprivileg "CREATE SESSION" hat, sonst nichts. SQL> connect system/passwort Connected. SQL> CREATE DIRECTORY q AS '/home/oracle/q'; Directory created. SQL> CREATE DIRECTORY z AS '/home/oracle/z'; Directory created. SQL> GRANT READ ON DIRECTORY q TO ralf; Grant succeeded. SQL> GRANT WRITE ON DIRECTORY z TO ralf; Grant succeeded. SQL> GRANT EXECUTE ON DBMS_FILE_TRANSFER to ralf; Grant succeeded. SQL> connect ralf/passwort Connected. SQL> execute DBMS_FILE_TRANSFER.COPY_FILE(SOURCE_DIRECTORY_OBJECT=>'Q', SOURCE_FILE_NAME=>'expdat.dmp', DESTINATION_DIRECTORY_OBJECT=>'Z', DESTINATION_DIRECTORY_FILE=>'expdat.dmp'); PL/SQL procedure successfully completed. PUT_FILEMit PUT_FILE können Sie eine Datei auf einen anderen Datenbankserver übertragen. Der Zugriff auf den anderen Datenbankserver findet mit einem Datenbank-Link statt, wie das Beispiel 2 zeigt.Beispiel 2 In diesem Beispiel wird eine Dump-Datei (von Data Pump) aus dem Verzeichnis "Q" des Datenbankservers mit der aktuellen Datenbanksitzung auf einen anderen Datenbankserver in das Verzeichnis "Z" kopiert. Hier wird davon ausgegangen, dass die DIRECTORY-Definition in den Datenbanken schon erfolgt ist und der lesende bzw. schreibende Zugriff auf die DIRECTORIES dem Benutzer "ralf" gewährt wurde. SQL> connect system/passwort Connected. SQL> CREATE PUBLIC DATABASE LINK DBREMOTE CONNECT TO ralf IDENTIFIED BY tiger USING 'dbremote'; SQL> GRANT EXECUTE ON DBMS_FILE_TRANSFER to ralf; Grant succeeded. SQL> connect ralf/passwort Connected. SQL> execute DBMS_FILE_TRANSFER.PUT_FILE(SOURCE_DIRECTORY_OBJECT=>'Q', SOURCE_FILE_NAME=>'expdat.dmp', DESTINATION_DIRECTORY_OBJECT=>'Z', DESTINATION_DIRECTORY_FILE=>'expdat.dmp', DESTINATION_DATABASE=>'DBREMOTE'); PL/SQL procedure successfully completed.Bei der Prozedur PUT_FILE wird die Zieldatenbank im letzten Parameter per Name des Datenbank-Link angegeben. GET_FILEMit GET_FILE können Sie eine Datei von einem Datenbankserver "holen", wie das Beispiel 3 zeigt.Beispiel 3 In diesem Beispiel wird eine Dump-Datei (von Data Pump) aus dem Verzeichnis "Q" des entfernten Datenbankservers in das Verzeichnis "Z" des lokalen Dastenbankservers kopiert. Es wird davon ausgegangen, dass der Datenbank-Link wie oben beschrieben schon angelegt und die Rechte wie oben beschrieben vergeben wurden. SQL> connect ralf/passwort Connected. SQL> execute DBMS_FILE_TRANSFER.GET_FILE(SOURCE_DIRECTORY_OBJECT=>'Q', SOURCE_FILE_NAME=>'expdat1.dmp', SOURCE_DATABASE=>'DBREMOTE', DESTINATION_DIRECTORY_OBJECT=>'Z', DESTINATION_DIRECTORY_FILE=>'expdat1.dmp'); PL/SQL procedure successfully completed.Hierbei ist zu beachten, dass der Datenbank-Link als dritter Parameter angegeben wird. FazitSie können mit DBMS_FILE_TRANSFER Dateien aus Datenbanksitzungen heraus kopieren. Dieses ist sehr hilfreich, wenn zum Beispiel Dateien mit Data Pump erstellt und dann innerhalb einer PL/SQL-Prozedur von Dastenbank zu Datenbank kopiert werden sollen. Ein gutes Beispiel ist dafür der Transfer von SQL Tuning Sets, bei dem die Definition der Tuning Sets mit PL/SQL-Aufrufen in Hilftabellen übertragen wird. Dann werden diese Tabellen exportiert und können mit DBMS_FILE_TRANSFER auf einen anderen Datenbankserver kopiert werden.Weitere Details können im Handbuch nachgelesen werden. |