工作中,有時需要把檔案從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 [+] > </code><code>cd</code> <code>data</code>
<code>ASMCMD [+data] > </code><code>cd</code> <code>orcl</code>
<code>ASMCMD [+data</code><code>/orcl</code><code>] > </code><code>cd</code> <code>datafile</code>
<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] > </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>] > </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>] > </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 -> </code><code>/home/grid/users</code><code>.dbf</code>
<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] ></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>] > </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 -> +data</code><code>/orcl/users</code><code>.dbf</code>
<code>ASMCMD [+data</code><code>/orcl/datafile</code><code>] > </code><code>cd</code> <code>+data</code><code>/orcl</code>
<code>ASMCMD [+data</code><code>/orcl</code><code>] > </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 => +DATA</code><code>/ORCL/PARAMETERFILE/spfile</code><code>.268.925423909</code>
<code> </code><code>N </code><code>users</code><code>.dbf => +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> </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> </code><code>create</code> <code>directory os_dir </code><code>as</code> <code>'/home/oracle'</code><code>;</code>
<code>#執行複制</code>
<code>SQL> </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> </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] > ls -l</code>
<code>Type Redund Striped </code><code>Time</code> <code>Sys </code><code>Name</code>
<code> </code><code>N user2.dbf => +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> </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> 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> </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> </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> 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,如需轉載請自行聯系原作者