Logo Oracle Deutschland   DBA Community  -  August 2011
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

  • Transfer von AWR Daten zu einer zentralen Datenbank für eine längere Archivierung
    Die AWR Daten können mit fertigen Skripten exportiert und importiert werden. Der Inhalt der Skripte kann aber auch in PL/SQL-Prozeduren kopiert und aus einer Datenbanksitzung heraus ausgeführt werden. Das hat den Vorteil, dass das Job-System der Datenbank (DBMS_SCHEDULER) dafür verwendet werden kann. Der Transfer der Daten kann mit DBMS_FILE_TRANSFER auch aus dieser Datenbanksitzung heraus erfolgen, ein Kontextwechsel in eine Betriebssystemsitzung ist dann nicht erforderlich.
  • Exportieren/Importieren von Daten mit Data Pump
    Das Exportieren und Importieren mit Data Pump erfolgt (im Gegensatz zum alten Export/Import) immer auf der Seite des Datenbankservers. Beim Exportieren landet die Dump-Datei immer in einem Verzeichnis auf dem Datenbankserver, welches zuvor mit CREATE DIRECTORY oder per Default bei der Installation angelegt wurde. Data Pump kann sowohl mit der Utility expdp bzw. impdp als auch mit den Packages DBMS_DATAPUMP und DBMS_METADATA, also in einer Datenbanksitzung genutzt werden. In diesem Fall ist es hilfreich, die Dump-Datei innerhalb der Datenbanksitzung auf einen anderen Datenbankserver zu kopieren, wenn sie dort importiert werden soll.
  • Transfer von exportierten SQL Tuning Sets
    Der obige Link verweist auf einen Tipp, der zeigt, wie SQL Tuning Sets von Datenbank zu Datenbank transferiert werden können. Dabei wird aber nur gezeigt, wie sie diese exportieren und importieren. Der Transfer kann auch in diesem Fall sehr elegant mit DBMS_FILE_TRANSFER durchgeführt werden.
  • Transportable Tablespaces
    Bei den transportablen Tablespaces werden die Datendateien selbst und die dazugehörigen Metadaten von Datenbank zu Datenbank übertragen. Auch hier können die Datendateien mit DBMS_FILE_TRANSFER übertragen werden.


Vorgehensweise

Das Package DBMS_FILE_TRANSFER besteht aus drei Prozeduren:
  • COPY_FILE
    Kopieren von Dateien innerhalb des Datenbankservers
  • PUT_FILE
    Kopieren von Dateien im Bringverfahren von Datenbankserver zu Datenbankserver
  • GET_FILE
    Kopieren von Dateien im Holverfahren von Datenbankserver zu Datenbankserver
Die Dateien, die kopiert werden sollen, müssen dabei zwei Bedingungen erfüllen:
  • Die Größe der Datei muß ein Vielfaches von 512 Byte sein. Dieses ist bei Dateien, die von Oracle erstellt werden (AWR Export, Data Pump,...), der Fall.
  • Die Datei darf nicht größer als 2 Terabyte sein.


COPY_FILE

Mit 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_FILE

Mit 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_FILE

Mit 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.

Fazit

Sie 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.

Zurück zur Community-Seite