从Oracle 10g开始,Oracle提供了DBMS_FILE_TRANSFER这么一个程序包,可以方便地在本地数据库和远程数据库,ASM和文件系统间传输数据库文件。这样数据库文件的传输就方便了许多,尤其是在传输基于ASM存储的数据文件时,不再局限于利用RMAN来进行传输。下面介绍一下这个包的用法。
DBMS_FILE_TRANSFER包一共包含了3个存储过程,分别提供本机之间、本机从远程主机抓取以及本机上传至远程主机三种传输数据库文件的功能。要求传输用户有对源目录读和对目标目录写的权限,单个数据库文件必须是512字节的整数倍并且文件大小必须小于或者等于2TB。
1、COPY_FILE。可以在数据库本机的文件系统之间,ASM磁盘组之间或者文件系统和ASM磁盘组之间方便地传输数据库文件。
DBMS_FILE_TRANSFER.COPY_FILE(
source_directory_object IN VARCHAR2,–源目录
source_file_name IN VARCHAR2,–源文件名
destination_directory_object IN VARCHAR2,–目标目录
destination_file_name IN VARCHAR2);–目标文件名SQL> create directory data as ‘+DATA/HELLODB/DATAFILE’;
SQL> create directory test as ‘+TEST/HELLODB/DATAFILE’;
SQL> exec DBMS_FILE_TRANSFER.PUT_FILE(‘DATA’,'system.286.650339101′, ‘TEST’,'system.dbf’)
ASMCMD> ls -a
+TEST/HELLODB/DATAFILE/system.dbf => COPY_FILE.256.654701983
2、GET_FILE。从远程数据库读取数据库文件并在本机的文件系统或者ASM磁盘组上创建一份复制文件。
DBMS_FILE_TRANSFER.GET_FILE(
source_directory_object IN VARCHAR2,
source_file_name IN VARCHAR2,
source_database IN VARCHAR2, –到远程数据库的db link名
destination_directory_object IN VARCHAR2,
destination_file_name IN VARCHAR2);begin
DBMS_FILE_TRANSFER.GET_FILE(‘DATA’,'system.286.650339101′, ‘lnk_test’,’TEST1′,’system.dbf’);
end;
/
3、PUT_FILE。在本地数据库将数据库文件传输至远程数据库的文件系统或者ASM磁盘组。
DBMS_FILE_TRANSFER.PUT_FILE(
source_directory_object IN VARCHAR2,
source_file_name IN VARCHAR2,
destination_directory_object IN VARCHAR2,
destination_file_name IN VARCHAR2,
destination_database IN VARCHAR2); –到目标数据库的db link名begin
DBMS_FILE_TRANSFER.COPY_FILE(‘DATA’,'system.286.650339101′, ‘TEST2′,’system.dbf’, ‘lnk_test’);
end;
/