天天看點

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,如需轉載請自行聯系原作者