1.DBMS_FILE_TRANSFER
The DBMS_FILE_TRANSFER package provides procedures to copy a binary file within a database or to transfer a binary file between databases. The destination database converts each block when it receives a file from a platform with different endianness. Datafiles can be imported after they are moved to the destination database as part of a transportable operation without RMAN conversion. Both GET and PUT operations will converted the file across platform difference at the destination. However, COPY is a local operation and therefore no conversion is required.
2.DBMS_FILE_TRANSFER.GET_FILE
Contacts a remote DATABASE TO READ a remote file AND THEN creates a copy OF the file IN the LOCAL file system conn system/password@DB1 -- create database link CREATE DATABASE LINK DB2 CONNECT TO system@remote IDENTIFIED BY password USING 'DB2'; -- create the destination directory object and a database link CREATE OR REPLACE DIRECTORY DIR_1 AS '/u02/oradata/db12c/'; conn system/password@DB2 -- create the destination directory object and a database link CREATE OR REPLACE DIRECTORY DIR_2 AS '/u02/oradata/db12c/'; -- get the file BEGIN DBMS_FILE_TRANSFER.GET_FILE(source_directory_object => 'DIR_2', source_file_name => 'users01.dbf', source_database => 'DB2', destination_directory_object => 'DBR_1', destination_file_name => 'users01.dbf'); END; / |
3.DBMS_FILE_TRANSFER.PUT_FILE
Reads a LOCAL file AND contacts a remote DATABASE TO CREATE a copy OF the file IN the remote file system -- LOGIN TO THE REMOTE SERVER CONN SYSTEM/PASSWORD@DB2 -- CREATE THE DESTINATION DIRECTORY OBJECT CREATE OR REPLACE DIRECTORY DRI_1 AS '/U02/ORADATA/DB12C/'; -- LOGIN TO THE LOCAL SERVER. CONN SYSTEM/PASSWORD@DB1 -- CREATE THE SOURCE DIRECTORY OBJECT, DATABASE LINK AND SWITCH TABLESPACE MODE CREATE OR REPLACE DIRECTORY DRI_2 AS '/U01/ORADATA/DB12C/'; CREATE DATABASE LINK DB2 CONNECT TO SYSTEM IDENTIFIED BY PASSWORD USING 'DB2'; ALTER TABLESPACE USERS READ ONLY; -- PUT THE FILE BEGIN DBMS_FILE_TRANSFER.PUT_FILE(SOURCE_DIRECTORY_OBJECT => 'DRI_1', SOURCE_FILE_NAME => 'USERS01.DBF', DESTINATION_DIRECTORY_OBJECT => 'DRI_2', DESTINATION_FILE_NAME => 'USERS01.DBF', DESTINATION_DATABASE => 'DB2'); END; / -- SWITCH THE TABLESPACE BACK TO READ WRITE MODE ALTER TABLESPACE USERS READ WRITE; |
4.XTTS
XTTS中的DBMS_FILE_TRANSFER方法就是使用这个功能
debug "$user: @{$transfer{$user}}\n"; foreach my $file (@{$transfer{$user}}) { # Bug 17673476: If the destination file is for ASM, it does not # work with automated filenames. So we convert the names here. # The automated filenames will be of format "x.y.z". This will # converted to "x_y_z" my $destFile = $file; if ($destFile =~ m/(.*)\.([0-9]+)\.([0-9]+)/) { $destFile = "$1_$2_$3"; } $sqlQuery = " BEGIN DBMS_FILE_TRANSFER.PUT_FILE( source_directory_object => '".$props{'srcdir'}."', source_file_name => '".$file."', destination_directory_object => '".$props{'dstdir'}."', destination_file_name => '".$destFile."', destination_database => '".$props{'dstlink'}."'); END; / quit; "; ## Invoke the backup as copy routine once generated as the last step $output = `sqlplus -L -s $connectstring <<EOF $sqlSettings $sqlQuery quit; EOF `; checkError ("Error in executing \n$sqlQuery\n", $output); foreach my $x (@getArray) { chomp ($x); if ($x =~ m/(.*?),(.*?),(.*)/) { my $sqlQuery = "BEGIN DBMS_FILE_TRANSFER.GET_FILE( source_directory_object => '".$props{'srcdir'}."', source_file_name => '".$2."', source_database => '".$props{'srclink'}."', destination_directory_object => '".$props{'dstdir'}."', destination_file_name => '".$3."'); END; / "; $getFileTemp = "getfile"."_$2"."_$1".".sql"; open FILE, ">$getFileTemp"; print FILE "$sqlQuery\nquit\n"; close FILE; ChecktoProceed($getParallel); $pid = fork(); if ($pid == 0) { PrintMessage ("Executing getfile for $getFileTemp"); $output = `sqlplus -L -s \"$connectstringcnvinst\" \@$getFileTemp`; checkError ("Error in executing $getFileTemp", $output); Unlink ($getFileTemp); exit (0); } else { UpdateForkArray ($pid, $getParallel); } } } |

