利用Rman的duplicate指令,可以很友善的将原庫複制出一個新庫,這在諸如data guard等應用中非常有用。但是在Oracle11g之前,執行duplicate要求首先對原庫用rman進行備份,然後将備份複制到複制庫,同時連接配接原庫(做為target)和複制庫(做為auxiliary),執行duplicate指令進行複制。在Oracle11g中推出的active database duplicate特性,則省略了進行rman備份的步驟,能夠直接從原庫複制出新庫,對于一些大型的資料庫來說,這個特性可以節省很多操作時間。本文将簡單的示範一下操作過程(在同一個主機上執行duplicate):
原庫:ora11g(歸檔模式) 新庫:oradup 作業系統:windows
一、首先手工建立新的instance
包括windows服務,dump路徑,初始化參數檔案,password檔案,監聽配置等等,這些步驟就不贅述了。理論上,初始化參數最少隻需要指定db_name一個參數就可以了。當然,簡單起見,最好還是設定如下參數:
DB_NAME=ORADUP CONTROL_FILES=(‘F:\ORACLE\ORADATA\ORADUP\CONTROL01.CTL’, ‘F:\ORACLE\ORADATA\ORADUP\CONTROL02.CTL’) DB_FILE_NAME_CONVERT=(‘F:\ORACLE\ORADATA\ORA11G’,'F:\ORACLE\ORADATA\ORADUP’) LOG_FILE_NAME_CONVERT=(‘F:\ORACLE\ORADATA\ORA11G’,'F:\ORACLE\ORADATA\ORADUP’) log_archive_dest_1=F:\ORACLE\ARCH\ORADUP compatible=11.1.0
經過試驗,必須加入compatible=11.1.0的參數,如果不加,預設是compatible=11.0.0,那麼rman duplicate最後在建立控制檔案的時候會報錯:
RMAN-03002: Duplicate Db 指令 (在 10/23/2007 22:43:40 上) 失敗 RMAN-06136: 來自輔助資料庫的 ORACLE 錯誤: ORA-01503: CREATE CONTROLFILE 失敗 ORA-01130: 資料庫檔案版本 11.1.0.0.0 與 ORACLE 版本 11.0.0.0.0 不相容 ORA-01110: 資料檔案 1: ‘F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF’
這個應該算是一個bug吧,11.0.0應該是beta版的版本号
加入log_archive_dest_1參數,則是因為最後需要複制原庫的歸檔日志到備庫,如果兩個庫都沒有設定歸檔路徑,那麼都會放在預設的$ORACLE_HOME\rdbms目錄下,就會發生沖突。當然,如果原庫和新庫在不同的主機上,則隻需要db_name和compatible就足夠了。
二、将oradup啟動到nomount狀态
C:\>set oracle_sid=oradup
C:\>sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 10月 23 21:43:18 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> conn / as sysdba
已連接配接到空閑例程。
SQL> startup nomount
ORACLE 例程已經啟動。
三、啟動rman,同時連接配接原庫和新庫
C:\>rman target sys/pass@ora11g auxiliary sys/pass@oradup
恢複管理器: Release 11.1.0.6.0 - Production on 星期二 10月 23 23:01:04 2007
連接配接到目标資料庫: ORA11G (DBID=4032954551)
已連接配接到輔助資料庫: ORADUP (未裝載)
這裡連接配接auxiliary庫必須提供使用者名和密碼,采用os認證的話可以連接配接進去但是duplicate會出錯,估計這個應該也是bug
四、執行duplicate
RMAN> duplicate target database to oradup
2> from active database;
啟動 Duplicate Db 于 23-10月-07
使用目标資料庫控制檔案替代恢複目錄
配置設定的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=99 裝置類型=DISK
記憶體腳本的内容:
{
set newname for datafile 1 to
"F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF";
set newname for datafile 2 to
"F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF";
set newname for datafile 3 to
"F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF";
set newname for datafile 4 to
"F:\ORACLE\ORADATA\ORADUP\USERS01.DBF";
backup as copy reuse
datafile 1 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF" datafile
2 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF" datafile
3 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF" datafile
4 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\USERS01.DBF" ;
sql 'alter system archive log current';
}
正在執行記憶體腳本
正在執行指令: SET NEWNAME
啟動 backup 于 23-10月-07
配置設定的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=138 裝置類型=DISK
通道 ORA_DISK_1: 啟動資料檔案副本
輸入資料檔案: 檔案号=00001 名稱=F:\ORACLE\ORADATA\ORA11G\SYSTEM01.DBF
輸出檔案名=F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF 标記=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 資料檔案複制完畢, 經過時間: 00:00:35
輸入資料檔案: 檔案号=00002 名稱=F:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF
輸出檔案名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF 标記=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 資料檔案複制完畢, 經過時間: 00:00:15
輸入資料檔案: 檔案号=00003 名稱=F:\ORACLE\ORADATA\ORA11G\UNDOTBS01.DBF
輸出檔案名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF 标記=TAG20071023T230115 RECID=0 STAMP=0
輸入資料檔案: 檔案号=00004 名稱=F:\ORACLE\ORADATA\ORA11G\USERS01.DBF
輸出檔案名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF 标記=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 資料檔案複制完畢, 經過時間: 00:00:01
完成 backup 于 23-10月-07
sql 語句: alter system archive log current
sql 語句: CREATE CONTROLFILE REUSE SET DATABASE "ORADUP" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'F:\ORACLE\ORADATA\ORADUP\REDO01.LOG' ) SIZE 5 M REUSE,
GROUP 2 ( 'F:\ORACLE\ORADATA\ORADUP\REDO02.LOG' ) SIZE 5 M REUSE,
GROUP 3 ( 'F:\ORACLE\ORADATA\ORADUP\REDO03.LOG' ) SIZE 5 M REUSE
DATAFILE
'F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF'
CHARACTER SET ZHS16GBK
archivelog like "F:\ORACLE\PRODUCT\11.1.0\DB_1\RDBMS\ARC00122_0636754423.001" auxiliary format
"F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001" ;
catalog clone archivelog "F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001";
switch clone datafile all;
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在開始複制歸檔日志
輸入歸檔日志線程=1 序列=122 RECID=6 STAMP=636764560
輸出檔案名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 RECID=0 STAMP=0
通道 ORA_DISK_1: 歸檔日志複制完成, 經過時間: 00:00:01
已編目的歸檔日志
歸檔日志檔案名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 RECID=1 STAMP=636764566
資料檔案 2 已轉換成資料檔案副本
輸入資料檔案副本 RECID=1 STAMP=636764566 檔案名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF
資料檔案 3 已轉換成資料檔案副本
輸入資料檔案副本 RECID=2 STAMP=636764567 檔案名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF
資料檔案 4 已轉換成資料檔案副本
輸入資料檔案副本 RECID=3 STAMP=636764567 檔案名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF
set until scn 208584;
recover
clone database
delete archivelog
;
正在執行指令: SET until clause
啟動 recover 于 23-10月-07
使用通道 ORA_AUX_DISK_1
正在開始媒體的恢複
線程 1 序列 122 的歸檔日志已作為檔案 F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 存在于磁盤上
歸檔日志檔案名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 線程=1 序列=122
媒體恢複完成, 用時: 00:00:00
完成 recover 于 23-10月-07
shutdown clone immediate;
startup clone nomount ;
資料庫已卸裝
Oracle 執行個體已關閉
已連接配接到輔助資料庫 (未啟動)
Oracle 執行個體已啟動
系統全局區域總計 146472960 位元組
Fixed Size 1331740 位元組
Variable Size 92278244 位元組
Database Buffers 50331648 位元組
Redo Buffers 2531328 位元組
set newname for tempfile 1 to
"F:\ORACLE\ORADATA\ORADUP\TEMP01.DBF";
switch clone tempfile all;
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF";
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF";
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\USERS01.DBF";
臨時檔案 1 在控制檔案中已重命名為 F:\ORACLE\ORADATA\ORADUP\TEMP01.DBF
已将資料檔案副本列入目錄
資料檔案副本檔案名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF RECID=1 STAMP=636764585
資料檔案副本檔案名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF RECID=2 STAMP=636764585
資料檔案副本檔案名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF RECID=3 STAMP=636764585
輸入資料檔案副本 RECID=1 STAMP=636764585 檔案名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF
輸入資料檔案副本 RECID=2 STAMP=636764585 檔案名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF
輸入資料檔案副本 RECID=3 STAMP=636764585 檔案名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF
Alter clone database open resetlogs;
資料庫已打開
完成 Duplicate Db 于 23-10月-07
五、檢查新庫狀态
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 10月 23 23:04:30 2007
已連接配接。
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
oradup OPEN
這種方式确實比較快捷友善,但是我在測試過程中碰到了很多的問題,一方面可能因為我沒有做很好的準備,隻是一個即興的測試,但這個新東西确實問題也不少,要到實用的階段估計還需要打幾個更新檔了。
本文轉自東方之子736651CTO部落格,原文連結: http://blog.51cto.com/ecloud/1118364,如需轉載請自行聯系原作者