天天看点

Oracle 从ASM复制文件到文件系统

工作中,有时需要把文件从ASM中复制到文件系统中或者反过来,做一些维护操作,本文介绍了4种复制文件的的方法:

ASMCMD中的cp命令(11g)

dbms_file_transfer包

rman的convert或backup as copy

FTP

下面分别介绍这4种方法

1、ASMCMD中的cp命令(11g)

cp命令是11g新增的命令,使用它可以轻松的把文件从ASM中复制到文件系统中或者反过来。还可以把ASM中的文件复制到网络上的其他服务器的文件系统中。

<code>#从ASM复制到文件系统</code>

<code>[grid@rac1 ~]$ asmcmd -p</code>

<code>ASMCMD [+] &gt; </code><code>cd</code> <code>data</code>

<code>ASMCMD [+data] &gt; </code><code>cd</code> <code>orcl</code>

<code>ASMCMD [+data</code><code>/orcl</code><code>] &gt; </code><code>cd</code> <code>datafile</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt; </code><code>ls</code>

<code>SYSAUX.257.925306091</code>

<code>SYSTEM.256.925306089</code>

<code>UNDOTBS1.258.925306091</code>

<code>UNDOTBS2.264.925306377</code>

<code>USERS.259.925306091</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt; </code><code>ls</code> <code>-l</code>

<code>Type      Redund  Striped  Time             Sys  Name</code>

<code>DATAFILE  UNPROT  COARSE   MAY 21 11:00:00  Y    SYSAUX.257.925306091</code>

<code>DATAFILE  UNPROT  COARSE   MAY 21 11:00:00  Y    SYSTEM.256.925306089</code>

<code>DATAFILE  UNPROT  COARSE   MAY 21 11:00:00  Y    UNDOTBS1.258.925306091</code>

<code>DATAFILE  UNPROT  COARSE   MAY 21 11:00:00  Y    UNDOTBS2.264.925306377</code>

<code>DATAFILE  UNPROT  COARSE   MAY 21 11:00:00  Y    USERS.259.925306091</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt; </code><code>cp</code> <code>USERS.259.925306091 </code><code>/home/grid/users</code><code>.dbf</code>

<code>copying +data</code><code>/orcl/datafile/USERS</code><code>.259.925306091 -&gt; </code><code>/home/grid/users</code><code>.dbf</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt;</code>

<code>#查看复制结果</code>

<code>[grid@rac1 ~]$ ll </code><code>/home/grid/users</code><code>.dbf </code>

<code>-rw-r-----. 1 grid oinstall 5251072 May 21 15:20 </code><code>/home/grid/users</code><code>.dbf</code>

<code>#从文件系统复制到ASM</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt; </code><code>cp</code> <code>/home/grid/users</code><code>.dbf +data</code><code>/orcl</code>

<code>copying </code><code>/home/grid/users</code><code>.dbf -&gt; +data</code><code>/orcl/users</code><code>.dbf</code>

<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] &gt; </code><code>cd</code> <code>+data</code><code>/orcl</code>

<code>ASMCMD [+data</code><code>/orcl</code><code>] &gt; </code><code>ls</code> <code>-l</code>

<code>Type           Redund  Striped  Time             Sys  Name</code>

<code>                                                 </code><code>Y    ARCHIVELOG/</code>

<code>                                                 </code><code>Y    CONTROLFILE/</code>

<code>                                                 </code><code>Y    DATAFILE/</code>

<code>                                                 </code><code>Y    ONLINELOG/</code>

<code>                                                 </code><code>Y    PARAMETERFILE/</code>

<code>                                                 </code><code>Y    TEMPFILE/</code>

<code>                                                 </code><code>N    spfileorcl.ora =&gt; +DATA</code><code>/ORCL/PARAMETERFILE/spfile</code><code>.268.925423909</code>

<code>                                                 </code><code>N    </code><code>users</code><code>.dbf =&gt; +DATA</code><code>/ASM/DATAFILE/users</code><code>.dbf.271.944580085</code>

cp的详细使用情况可以使用help cp命令获得。

如果ASM的版本是11g以前的版本可以使用如下三种方法复制文件。

2、dbms_file_transfer包

这个包是从Oracle 9不开始提供的,利用这个包可以在两个位置之间传输文件,这两个位置可以是同一台计算机或者网络上的两台计算机。Oracle10g扩展了这个包的功能,可以完成从一个ASM Diskgroup拷贝到另一个ASM Diskgroup、从ASM Diskgroup拷贝到普通文件系统、从普通文件系统拷贝到ASM Diskgroup、从文件系统拷贝到文件系统或者RAW Device。这个包提供了3个方法,可以完成不同的任务。

   方法

                                                     功能说明

copy_file

完成文件从本地一个目录拷贝到本地的另一个目录,这个方法不能完成远程传输

get_file

这个方法完成把远程的文件拷贝到本地的目录中,类似于下载

put_file

这个方法完成本地文件传送到远程的目的,类似于上传

使用方法:

<code>#创建目录</code>

<code>SQL&gt; </code><code>create</code> <code>directory asm_dir </code><code>as</code> <code>'+data/ASM/DATAFILE/'</code><code>;</code>

<code>Directory created.</code>

<code>SQL&gt; </code><code>create</code> <code>directory os_dir </code><code>as</code> <code>'/home/oracle'</code><code>;</code>

<code>#执行复制</code>

<code>SQL&gt; </code><code>exec</code> <code>dbms_file_transfer.copy_file(</code><code>'asm_dir'</code><code>,</code><code>'user2.dbf.272.944581345'</code><code>,</code><code>'os_dir'</code><code>,</code><code>'user.dbf'</code><code>);</code>

<code>PL/SQL </code><code>procedure</code> <code>successfully completed.</code>

<code>#验证复制结果</code>

<code>[oracle@rac1 ~]$ ls -l /home/oracle/</code><code>user</code><code>.dbf</code>

<code>-rw-r</code><code>-----. 1 oracle asmadmin 5251072 May 21 15:49 /home/oracle/user.dbf</code>

<code>#进行反向复制</code>

<code>SQL&gt; </code><code>exec</code> <code>dbms_file_transfer.copy_file(</code><code>'os_dir'</code><code>,</code><code>'user.dbf'</code><code>,</code><code>'asm_dir'</code><code>,</code><code>'user2.dbf'</code><code>);</code>

<code>#验证</code>

<code>ASMCMD [+data/ASM/DATAFILE] &gt; ls -l</code>

<code>Type      Redund  Striped  </code><code>Time</code>             <code>Sys  </code><code>Name</code>

<code>                                            </code><code>N    user2.dbf =&gt; +DATA/ORCL/DATAFILE/COPY_FILE.273.944581883</code>

3、rman的convert和backup as copy命令

3.1 convert命令

convert命令是用于对数据文件进行字节格式转换的。Oracle可以在不同OS平台间进行表空间传(TTS),如果两个平台的字节格式不一致,则需要参数据文件进行格式转换,这个转换可以 在源数据库进行,也可以在目的数据库中执行。如果在源数据库中执行,则需要使用convert tablespace命令,如果在目的数据库中执行,则需要使用convert datafile命令。

虽然convert这个命令主要用于跨平台传输表空间,它也可以完成ASM和本地文件系统间拷贝文件,并且也是很简单的一种方法。

<code>#使用</code><code>convert</code> <code>datafile从ASM复制到文件系统</code>

<code>RMAN&gt; </code><code>convert</code> <code>datafile </code><code>'+data/orcl/datafile/USERS.259.925306091'</code> <code>format </code><code>'/home/oracle/user3.dbf'</code><code>;</code>

<code>Starting conversion </code><code>at</code> <code>target </code><code>at</code> <code>21-MAY-17</code>

<code>using channel ORA_DISK_1</code>

<code>channel ORA_DISK_1: starting datafile conversion</code>

<code>input file </code><code>name</code><code>=+DATA/orcl/datafile/users.259.925306091</code>

<code>converted datafile=/home/oracle/user3.dbf</code>

<code>channel ORA_DISK_1: datafile conversion complete, elapsed </code><code>time</code><code>: 00:00:01</code>

<code>Finished conversion </code><code>at</code> <code>target </code><code>at</code> <code>21-MAY-17</code>

<code>[oracle@rac1 ~]$ ls -l /home/oracle/user3.dbf</code>

<code>-rw-r</code><code>-----. 1 oracle asmadmin 5251072 May 21 16:00 /home/oracle/user3.dbf</code>

<code>#使用</code><code>convert</code> <code>tablespace,使用时需要把users表空间置为只读</code>

<code>RMAN&gt; sql </code><code>'alter tablespace users read only'</code><code>;</code>

<code>using target </code><code>database</code> <code>control file </code><code>instead</code> <code>of</code> <code>recovery catalog</code>

<code>sql statement: </code><code>alter</code> <code>tablespace users </code><code>read</code> <code>only</code>

<code>RMAN&gt; </code><code>convert</code> <code>tablespace users format </code><code>'/home/oracle/users%U.dbf'</code><code>;</code>

<code>Starting conversion </code><code>at</code> <code>source </code><code>at</code> <code>21-MAY-17</code>

<code>allocated channel: ORA_DISK_1</code>

<code>channel ORA_DISK_1: SID=81 instance=orcl1 device type=DISK</code>

<code>input datafile file number=00004 </code><code>name</code><code>=+DATA/orcl/datafile/users.259.925306091</code>

<code>converted datafile=/home/oracle/usersdata_D-ORCL_I-1453086940_TS-USERS_FNO-4_0ns4qbtn.dbf</code>

<code>Finished conversion </code><code>at</code> <code>source </code><code>at</code> <code>21-MAY-17</code>

<code>[oracle@rac1 ~]$ ll /home/oracle/usersdata_D-ORCL_I-1453086940_TS-USERS_FNO-4_0ns4qbtn.dbf</code>

<code>-rw-r</code><code>-----. 1 oracle asmadmin 5251072 May 21 16:03 /home/oracle/usersdata_D-ORCL_I-1453086940_TS-USERS_FNO-4_0ns4qbtn.dbf</code>

<code>#从文件系统拷贝到ASM</code>

<code>RMAN&gt; </code><code>convert</code> <code>datafile </code><code>'/home/oracle/user3.dbf'</code><code>,</code><code>'/home/oracle/usersdata_D-ORCL_I-1453086940_TS-USERS_FNO-4_0ns4qbtn.dbf'</code> <code>format </code><code>'+data'</code><code>;</code>

<code>channel ORA_DISK_1: SID=64 instance=orcl1 device type=DISK</code>

<code>input file </code><code>name</code><code>=/home/oracle/user3.dbf</code>

<code>converted datafile=+DATA/orcl/datafile/users.274.944582713</code>

<code>input file </code><code>name</code><code>=/home/oracle/usersdata_D-ORCL_I-1453086940_TS-USERS_FNO-4_0ns4qbtn.dbf</code>

<code>converted datafile=+DATA/orcl/datafile/users.275.944582713</code>

<code>#从日志中看出转换的文件名</code>

<code>#converted datafile=+DATA/orcl/datafile/users.274.944582713</code>

3.2 backup as copy命令

backup as copy命令是以镜像的方式对文件进行备份,自然可以把文件从ASM复制到文件系统中。这也是从文件系统迁移到ASM时可以选择的方法之一。

<code>RMAN&gt; backup </code><code>as</code> <code>copy datafile </code><code>'+DATA/orcl/datafile/users.259.925306091'</code> <code>format </code><code>'/home/oracle/user4.dbf'</code><code>;</code>

<code>Starting backup </code><code>at</code> <code>21-MAY-17</code>

<code>channel ORA_DISK_1: SID=69 instance=orcl1 device type=DISK</code>

<code>channel ORA_DISK_1: starting datafile copy</code>

<code>output</code> <code>file </code><code>name</code><code>=/home/oracle/user4.dbf tag=TAG20170521T161225 RECID=17 STAMP=944583145</code>

<code>channel ORA_DISK_1: datafile copy complete, elapsed </code><code>time</code><code>: 00:00:01</code>

<code>Finished backup </code><code>at</code> <code>21-MAY-17</code>

<code>[oracle@rac1 ~]$ ls -l /home/oracle/user4.dbf </code>

<code>-rw-r</code><code>-----. 1 oracle asmadmin 5251072 May 21 16:12 /home/oracle/user4.dbf</code>

4.FTP方法

      本文转自hbxztc 51CTO博客,原文链接:http://blog.51cto.com/hbxztc/1927904,如需转载请自行联系原作者