利用dbms_file_transfer实现文件系统和ASM间拷贝数据文件及从ASM到远端ASM文件传输
最近在学习两台使用ASM文件系统的数据库DG的搭建,由于目标数据库数据量比较大(25TB),并且没有足够存放备份的空间,这就需要借助于ORACLE 10g推出的DBMS_FILE_TRANSFER包来传输数据文件,本文参考老杨(杨廷昆老师)的BLOG上找到DBMS_FILE_TRANSFER包的相关文章。
大家都知道要实现文件系统和ASM间拷贝数据文件使用RMAN可以实现,但是可能还有部分人不知道使用DBMS_FILE_TRANSFER包也可以实现,不过DBMS_FILE_TRANSFER包只可以拷贝二进制文件,并且单个文件大小不能超过2TB,以下为从ASM拷贝数据文件到文件系统的实验过程:
1.查询数据文件位置
SQL> select name from v$datafile; NAME -------------------------------------------- +DATA/fhacdb/datafile/system.260.787157273 +DATA/fhacdb/datafile/sysaux.259.787157277 +DATA/fhacdb/datafile/undotbs1.258.787157281 +DATA/fhacdb/datafile/users.256.787157289
2.创建所需的DIRECTOTY
SQL> create directory filesystem as '/home/oracle'; Directory created. SQL> create directory asm_dir as '+DATA/fhacdb/datafile'; Directory created.
3.将USERS表空间热备
SQL> alter tablespace USERS begin backup; Tablespace altered.
4.将ASM里的USER表空间对应的数据文件拷贝到文件系统
SQL> exec dbms_file_transfer.copy_file('ASM_DIR','users.256.787157289','FILESYSTEM','users01.dbf'); PL/SQL procedure successfully completed.
以上DBMS_FILE_TRANSFER包用到了4个参数,分别为:源文件的路径、源文件名称、目标文件路径、目标文件名称。
5.关闭USERS表空间热备
SQL> alter tablespace HANLONG end backup; Tablespace altered.
6.验证文件是否拷贝成功
SQL> ! ls -l /home/oracle 总计 22668 drwxr-xr-x 10 oracle oinstall 4096 06-29 10:26 AutoCheck -rw-r--r-- 1 oracle oinstall 14064061 03-06 14:17 AutoCheck.exe drwxr-xr-x 2 oracle oinstall 4096 06-20 14:11 Desktop drwxr-xr-x 3 oracle oinstall 4096 06-20 13:20 install -rw-r----- 1 oracle oinstall 354 06-28 15:21 LOG_cat_owb.TXT -rw-r--r-- 1 oracle oinstall 3537885 06-18 16:32 tiftojpg.jar -rw-r----- 1 oracle oinstall 5259264 07-09 14:16 users01.dbf
7.从文件系统拷贝数据文件到ASM从文件系统拷贝文件到ASM只需要将DBMS_FILE_TRANSFER包的参数位置调换即可,比如:
SQL> exec dbms_file_transfer.copy_file('FILESYSTEM','users01.dbf','ASM_DIR','test01.dbf'); PL/SQL procedure successfully completed.
8.验证文件是否正确拷贝
[grid@dbserver1 ~]$ asmcmd ASMCMD> cd DATA/FHACDB/DATAFILE ASMCMD> ls test* test01.dbf
相比RMAN来说,RMAN只能在本机上实现文件系统和ASM间文件的拷贝,DBMS_FILE_TRANSFER包不但可以实现在本机拷贝,还可以通过DBLINK在不同服务器间数据文件的传输,下面简单演示下利用DBMS_FILE_TRANSFER包的PUT_FILE从本地ASM将数据文件传输到远端ASM上:
1.查看数据文件位置
SQL> conn dbdream/dbdream Connected. SQL> select name from v$datafile; NAME -------------------------------------------- +DATA/fhacdb/datafile/system.261.784217547 +DATA/fhacdb/datafile/sysaux.262.784217553 +DATA/fhacdb/datafile/undotbs1.263.784217557 +DATA/fhacdb/datafile/users.265.784217587 +DATA/fhacdb/datafile/arrangements01.dbf +DATA/fhacdb/datafile/digital01.dbf +DATA/fhacdb/datafile/early_data01.dbf +PIC01/fhacdb/datafile/pic01.dbf +PIC03/fhacdb/datafile/pic03.dbf +PIC02/fhacdb/datafile/pic02.dbf +PIC08/fhacdb/datafile/pic08.dbf +DATA/fhacdb/datafile/resourcedb01.dbf +PIC06/fhacdb/datafile/pic06.dbf +PIC07/fhacdb/datafile/pic07.dbf +PIC05/fhacdb/datafile/pic05.dbf +PIC04/fhacdb/datafile/pic04.dbf +DATA/fhacdb/datafile/application01.dbf +DATA/fhacdb/datafile/authsystem01.dbf +DATA/fhacdb/datafile/compose01.dbf +DATA/fhacdb/datafile/ces01.dbf +DATA/fhacdb/datafile/hanwang01.dbf +DATA/fhacdb/datafile/hanlong01.dbf +DATA/fhacdb/datafile/xingzhen01.dbf
2.创建DIRECTORY
SQL> create directory from_asm as '+DATA/fhacdb/datafile'; Directory created.
3.创建及测试DBLINK
SQL> create database link fhac connect to dbdream identified by dbdream using '192.168.20.101/fhacdb'; Database link created. SQL> select * from tab@fhac; no rows selected
4.利用DBMS_FILE_TRANSFER的PUT_FILE传输数据文件
SQL> exec dbms_file_transfer.put_file('FROM_ASM','authsystem01.dbf','ASM_DIR','authsystem01.dbf','FHAC'); PL/SQL procedure successfully completed.
DBMS_FILE_TRANSFER的PUT_FILE和GET_FILE比COPY_FILE多了一个参数(DBLINK NAME),以上参数依次为:本地DIRECTORY_NAME、要传输的本地文件名、目标DIRECTORY_NAME、传输到目标服务器上保留的文件名、数据链名。
5.验证文件是否正确传输
[oracle@dbserver1 ~]$ su - grid Passwd: [grid@dbserver1 ~]$ [grid@dbserver1 ~]$ asmcmd ASMCMD> cd DATA/FHACDB/DATAFILE ASMCMD> ls auth* authsystem01.dbf
DBMS_FILE_TRANSFER的PUT_FILE和GET_FILE和FTP有些类似,PUT_FILE是将本地文件上传到远端服务器,GET_FILE是将远端服务器的文件下载到本地服务器,下面演示下GET_FILE的用法:
1.建议DIRECTORY由于之前的实验已经建立了DIRECTORY,这里仍使用之前的DIRECTORY,不再单独建立。
2.创建DBLINK
SQL> create database link fhac_105 connect to dbdream identified by dbdream using 'fhacdb'; Database link created.
3.下载文件
SQL> exec dbms_file_transfer.get_file('FROM_ASM','ces01.dbf','fhac_105','ASM_DIR','ces01.dbf'); PL/SQL procedure successfully completed.
GET_FILE的参数顺序和PUT_FILE不同,这里的参数依次为:远端DIRECTORY_NAME、要下载的远端文件名、数据链名、本地DIRECTORY_NAME、下载到本地保留的文件名。
4.验证文件是否下载
[oracle@dbserver1 admin]$ su - grid Passwd: [grid@dbserver1 ~]$ asmcmd ASMCMD> cd data/fhacdb/datafile ASMCMD> ls ces* ces01.dbf