[Oracle][rman]快速複製資料庫-rman Duplicate

[Oracle][rman]快速複製資料庫-rman Duplicate

這篇算是rman的進階應用,當初在搞DG時還好以把rman duplicate練習的滾瓜爛熟,節省了大量複製datafile時間,因為利用rman duplicate可以快速create physical standby(如果你的生產DB Size快1T,你一定會說rman duplicate真是佛心來的!)。

雖然複製DB還有其他方法,如Clone,Datapump(logical expdp/impdp),每種方法各有其優缺點,只要依需求、系統環境及資源選對方法,我想每種方法都能發揮其存在的價值。

rman是oracle提供的物理備份還原工具(小弟認為相當強大,佩服Oracle開發團隊),通常用來備份或還原datafile、control file、archivelog及參數檔(*.ora),也可以執行DB完全或不完全的恢復,熟悉rman備份與還原操作算是Oracle DBA的基本課題(如同呼吸一樣親切自然阿)。

 

文章均為自己見解,如有錯誤還請指教

當執行DUPLICATE TARGET DATABASE TO target db運作如下圖

image

server session:執行rman duplicate。

1.取得rman repostiory備份相關資訊(來源可能是control file or catalog db)

2.建立channel並依repostiory資訊獲得rman backupsets實體檔案路徑開始duplicate

 

這裡將不說明其他rman基礎(等有空小弟在整理),我直接示範整個rman duplicate操作過程

 

測試平台:windows 2003 R2

Source DB Size:8.65GB

 

事前工作

*建立密碼檔案(target)

*建立instance and oracle services(target)

*確認Source DB已有完整備份檔案

*建立listen(target)

*check archivelog mode

事前工作都確認OK,就可以動手了

 

1.修改參數檔

create source DB參數檔(*.ora),修改正確後準備套用在target DB。

SQL>Create pfile=’f:\bk\duprule.ora’ from spfile(source db操作)

DUPRULE.__db_cache_size=234881024

DUPRULE.__java_pool_size=4194304

DUPRULE.__large_pool_size=4194304  #可以將large_pool_size設定大一點,避免執行過程中因large_pool_size不足導致失敗

DUPRULE.__shared_pool_size=192937984

DUPRULE.__streams_pool_size=4194304

*.audit_file_dest='D:\oracle\product\10.2.0/admin/DUPRULE/adump'    #duprule=target db sid

*.background_dump_dest='D:\oracle\product\10.2.0/admin/DUPRULE/bdump'

*.compatible='10.2.0.2.0'

*.control_files='D:\oradata\duprule\control01.ctl','D:\oradata\duprule\control02.ctl','D:\oradata\duprule\control03.ctl'

*.core_dump_dest='D:\oracle\product\10.2.0/admin/DUPRULE/cdump'

*.db_block_size=8192

*.db_domain='test.com'

*.db_file_multiblock_read_count=16

*.db_name='DUPRULE'

*.db_file_name_convert=('G:\oradata\prorule1','D:\oradata\duprule')  #rman duplicate 主要參數

*.log_file_name_convert=('G:\oradata\prorule1','D:\oradata\duprule')  #rman duplicate 主要參數

*.db_recovery_file_dest='D:\oracle\product\10.2.0/flash_recovery_area'

*.db_recovery_file_dest_size=21474836480

*.dispatchers='(PROTOCOL=TCP) (SERVICE=sklrule1XDB)'

*.job_queue_processes=10

*.nls_language='TRADITIONAL CHINESE'

*.nls_length_semantics='CHAR'

*.nls_territory='TAIWAN'

*.open_cursors=300

*.pga_aggregate_target=147849216

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=445644800

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='D:\oracle\product\10.2.0/admin/DUPRULE/udump'

 

修改完成並套用在target db,並將instance nomount

SQL>create spfile from pfile=’ D:\bk\duplicate\duprule.ora’;(target db 操作)

SQL>startup nomunt;

 

2.手動配置auxiliary channel並執行duplicate(source db操作)

Set oracle_sid=prorule1

rman target / auxiliary sys/密碼@DUPRULE   (小弟將一些敏感字上了馬賽克)

image

(如果你無法連接到auxiliary db,可以先檢查listen status是否正常)

Rman>RUN{ALLOCATE AUXILIARY CHANNEL ax1 DEVICE TYPE DISK;

ALLOCATE AUXILIARY CHANNEL ax2 DEVICE TYPE DISK;

ALLOCATE AUXILIARY CHANNEL ax3 DEVICE TYPE DISK;

ALLOCATE AUXILIARY CHANNEL ax4 DEVICE TYPE DISK;

DUPLICATE TARGET DATABASE TO DUPRULE;}

image

(channel越多速度越快)

image

過程中都沒錯誤,將自動resetlogs(oracle還滿貼心的)

clip_image001

這樣就大功告成了

8.65GB的Source Database,花不到8分鐘就完成複製(時間就是金錢阿),相當正點