天天看點

Oracle11g新特性:Active Database Duplicate

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