Oracle 11g RMAN可以實現基於活動數據庫進行異機克隆,從而省去須要先備份再ftp到輔助服務器的過程。這一切能夠所有交給Oracle來搞定。在克隆期間,Oracle會讀取Target DB的全部數據結構,無須人爲的干預(不一樣的磁盤系統,文件路徑與文件名要指定轉換方式)。儘管如此,對於生產環境數據庫在整個克隆期間性能會降低,其次在Target Server與Auxiliary Server中會產生較大的網絡流量。若是這些能夠接受的話,從活動數據庫進行異機克隆是一個不錯的選擇。本文首先描述了克隆時不一樣的鏈接與克隆方式樣本,最後演示了基於活動數據庫的克隆。linux
一、RMAN不一樣克隆類型的鏈接方式
關於RMAN不一樣克隆類型,請參考: 基於 RMAN 的同機數據庫克隆 基於RMAN的異機數據庫克隆(rman duplicate)
$ export ORACLE_SID=sybo3
# 從備份集克隆,不鏈接到Target DB以及catalog,或者沒有使用catalog
$ rman AUXILIARY /
# 從備份集克隆,無catalog,元數據來源於Target DB控制文件
$ rman TARGET sys/pwd@TAR AUXILIARY sys/pwd@AUX
# 從備份集克隆鏈接到catalog,但不鏈接到target DB,元數據庫來自RMAN catalog
$ rman CATALOG rman/pwd@catalogdb AUXILIARY sys/pwd@AUX
# 同時鏈接到target DB以及catalog 元數據來源於Target DB控制文件或catalog,該方式支持從備份集克隆,從活動數據庫克隆
$ rman TARGET sys/pwd@TAR CATALOG rman/pwd@catalogdb AUXILIARY sys/pwd@AUXsql
二、經常使用的數據庫克隆場景
# Auxiliary DB使用與Target DB相同的磁盤系統,文件位置及文件名,下同。須要轉換的情形請參考: RMAN 數據庫克隆文件位置轉換方法
DUPLICATE TARGET DATABASE TO sybo3
SPFILE
NOFILENAMECHECK;
# 將數據庫克隆到Target DB一週之前的狀態,注,備份集或歸檔日誌應存在
DUPLICATE TARGET DATABASE TO sybo3
UNTIL TIME 'SYSDATE-7'
SPFILE
NOFILENAMECHECK;
# 備份集保存在不一樣於Target DB保存的位置,此時須要在RMAN中單獨指定其位置
DUPLICATE DATABASE TO sybo3
SPFILE
BACKUP LOCATION '/u01/bak/fast_recovery_area/sybo3'
NOFILENAMECHECK;shell
三、基於活動數據庫克隆圖示數據庫
四、演示機遇活動數據庫異機克隆
服務器
--環境: --目標數據庫: 192.168.7.25/sybo3 /u01/database/sybo3 主機名:linux3 --輔助數據庫: 192.168.7.26/sybo3 /u01/database/sybo3 主機名:linux4 目標數據庫與輔助數據庫使用相同的文件位置 --說明: --本次演示使用爲使用任何備份文件,鏈接到target DB。 --對於下面描述過程當中,如建立參數文件,密碼文件,監聽等等有不甚瞭解的,可參考下面連接中有關文章的描述。 --http://blog.csdn.net/robinson_0612/article/category/827734 (體系結構相關) --http://blog.csdn.net/robinson_0612/article/category/828434 (網絡配置相關) [oracle@linux3 database]$ cat /etc/issue Enterprise Linux Enterprise Linux Server release 5.5 (Carthage) Kernel \r on an \m SQL> select * from v$version where rownum<2; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production --Target DB的配置,位於主機linux3 SQL> select instance_name,host_name from v$instance; INSTANCE_NAME HOST_NAME ---------------- ---------------------------------------------------------------- sybo3 linux3.orasrv.com --Target DB處於歸檔模式 SQL> select name,open_mode,log_mode from v$database; NAME OPEN_MODE LOG_MODE --------- -------------------- ------------ SYBO3 READ WRITE ARCHIVELOG --Target DB上用於驗證克隆成功的表 SQL> select * from t; NAME ACTION ---------- -------------------- Robinson Transfer DB Jackson Transfer DB by rman -- Author : Robinson Cheng -- Blog : http://blog.csdn.net/robinson_0612 [oracle@linux3 ~]$ export ORACLE_SID=sybo3 [oracle@linux3 ~]$ rman target / RMAN> list backupset; --->目標數據庫無任何備份集 specification does not match any backup in the repository RMAN> list copy; specification does not match any datafile copy in the repository specification does not match any control file copy in the repository specification does not match any archived log in the repository RMAN> list backup of archivelog all; specification does not match any backup in the repository a、在Auxiliary server建立相應的dump文件夾 [oracle@linux4 database]$ more sybo3.sh #!/bin/sh mkdir -p /u01/database mkdir -p /u01/database/sybo3/adump mkdir -p /u01/database/sybo3/controlf mkdir -p /u01/database/sybo3/fra mkdir -p /u01/database/sybo3/oradata mkdir -p /u01/database/sybo3/redo mkdir -p /u01/database/sybo3/dpdump mkdir -p /u01/database/sybo3/pfile [oracle@linux4 database]$ ./sybo3.sh b、配置輔助實例參數文件 --因爲auxiliary DB與target DB不存在文件位置轉換,所以無需做任何修改,直接將其ftp到Auxiliary server --若是沒有pfile文件,可從target db生成。 create pfile from spfile; [oracle@linux3 ~]$ scp $ORACLE_HOME/dbs/initsybo3.ora 192.168.7.26:$ORACLE_HOME/dbs c、生成輔助實例密碼文件 --若是使用orapwd命令創建密碼文件應保證與target DB密碼相同 --或者直接使用Target DB的密碼文件 [oracle@linux3 ~]$ scp $ORACLE_HOME/dbs/orapwsybo3 192.168.7.26:$ORACLE_HOME/dbs d、在Auxiliary Server與Target Server配置監聽(方式多樣,不詳述) --Auxiliary Server [oracle@linux4 admin]$ more listener.ora SID_LIST_LISTENER_SYBO3 = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = sybo3.orasrv.com) (ORACLE_HOME = /u01/oracle/db_1) (SID_NAME = sybo3) ) ) LISTENER_SYBO3 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.26)(PORT = 1531)) ) ADR_BASE_LISTENER_SYBO3 = /u01/oracle [oracle@linux4 admin]$ more tnsnames.ora TAR = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1531)) ) (CONNECT_DATA = (SERVICE_NAME = SYBO3.ORASRV.COM) ) ) AUX = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.26)(PORT = 1531)) ) (CONNECT_DATA = (SERVICE_NAME = SYBO3.ORASRV.COM) ) ) --Target Server [oracle@linux3 ~]$ more /u01/oracle/db_1/network/admin/listener.ora # listener.ora Network Configuration File: /u01/oracle/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER_SYBO3 = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = sybo3.orasrv.com) (ORACLE_HOME = /u01/oracle/db_1) (SID_NAME = sybo3) ) ) LISTENER_SYBO3 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = linux3.orasrv.com)(PORT = 1531)) ) ADR_BASE_LISTENER_SYBO3 = /u01/oracle [oracle@linux3 ~]$ more /u01/oracle/db_1/network/admin/tnsnames.ora # tnsnames.ora Network Configuration File: /u01/oracle/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. # 注,在Target Server與Auxiliary Server的tnames.ora文件中,使用了相同的entry,即同時存在TAR與AUX TAR = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.25)(PORT = 1531)) ) (CONNECT_DATA = (SERVICE_NAME = SYBO3.ORASRV.COM) ) ) AUX = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.26)(PORT = 1531)) ) (CONNECT_DATA = (SERVICE_NAME = SYBO3.ORASRV.COM) ) ) --使用下面的命令確保可以Ping通 [oracle@linux3 admin]$ tnsping TAR [oracle@linux3 admin]$ tnsping AUX [oracle@linux4 admin]$ tnsping TAR [oracle@linux4 admin]$ tnsping AUX e、實施數據庫克隆 [oracle@linux4 ~]$ export ORACLE_SID=sybo3 [oracle@linux4 ~]$ sqlplus / as sysdba SQL> startup nomount; SQL> exit [oracle@linux4 ~]$ rman target sys/oracle@TAR auxiliary sys/oracle@AUX Recovery Manager: Release 11.2.0.1.0 - Production on Fri Aug 2 11:44:09 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. connected to target database: SYBO3 (DBID=2347733014) connected to auxiliary database: SYBO3 (not mounted) RMAN> duplicate database to sybo3 from active database spfile nofilenamecheck; --->發佈duplicate命令 Starting Duplicate Db at 02-AUG-13 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=134 device type=DISK contents of Memory Script: { backup as copy reuse --->該命令塊備份服務器參數文件並修改spfile參數 targetfile '/u01/oracle/db_1/dbs/spfilesybo3.ora' auxiliary format '/u01/oracle/db_1/dbs/spfilesybo3.ora' ; sql clone "alter system set spfile= ''/u01/oracle/db_1/dbs/spfilesybo3.ora''"; } executing Memory Script Starting backup at 02-AUG-13 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=145 device type=DISK Finished backup at 02-AUG-13 sql statement: alter system set spfile= ''/u01/oracle/db_1/dbs/spfilesybo3.ora'' contents of Memory Script: { sql clone "alter system set db_name = --->該命令塊主要是修改db_name,重啓auxliary DB ''SYBO3'' comment= ''duplicate'' scope=spfile"; shutdown clone immediate; startup clone nomount; } executing Memory Script sql statement: alter system set db_name = ''SYBO3'' comment= ''duplicate'' scope=spfile Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 376635392 bytes Fixed Size 1336652 bytes Variable Size 285215412 bytes Database Buffers 83886080 bytes Redo Buffers 6197248 bytes contents of Memory Script: { sql clone "alter system set db_name = ''SYBO3'' comment= ''Modified by RMAN duplicate'' scope=spfile"; sql clone "alter system set db_unique_name = ''SYBO3'' comment= ''Modified by RMAN duplicate'' scope=spfile"; shutdown clone immediate; startup clone force nomount --->該命令塊備份控制文件並恢復控制文件到Auxiliary DB backup as copy current controlfile auxiliary format '/u01/database/sybo3/controlf/control01.ctl'; restore clone controlfile to '/u01/database/sybo3/controlf/control02.ctl' from '/u01/database/sybo3/controlf/control01.ctl'; alter clone database mount; } executing Memory Script sql statement: alter system set db_name = ''SYBO3'' comment= ''Modified by RMAN duplicate'' scope=spfile sql statement: alter system set db_unique_name = ''SYBO3'' comment= ''Modified by RMAN duplicate'' scope=spfile Oracle instance shut down Oracle instance started Total System Global Area 376635392 bytes Fixed Size 1336652 bytes Variable Size 285215412 bytes Database Buffers 83886080 bytes Redo Buffers 6197248 bytes Starting backup at 02-AUG-13 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy copying current control file output file name=/u01/oracle/db_1/dbs/snapcf_sybo3.f tag=TAG20130802T114449 RECID=5 STAMP=822397490 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 02-AUG-13 Starting restore at 02-AUG-13 allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=133 device type=DISK channel ORA_AUX_DISK_1: copied control file copy Finished restore at 02-AUG-13 database mounted RMAN-05538: WARNING: implicitly using DB_FILE_NAME_CONVERT --->這個地方提示隱式使用DB_FILE_NAME_CONVERT參數 contents of Memory Script: { --->該命令塊用於set newname以及熱備數據文件,使用copy方式 set newname for datafile 1 to "/u01/database/sybo3/oradata/system01.dbf"; set newname for datafile 2 to "/u01/database/sybo3/oradata/sysaux01.dbf"; set newname for datafile 3 to "/u01/database/sybo3/oradata/undotbs01.dbf"; set newname for datafile 4 to "/u01/database/sybo3/oradata/users01.dbf"; set newname for datafile 5 to "/u01/database/sybo3/oradata/example01.dbf"; backup as copy reuse datafile 1 auxiliary format "/u01/database/sybo3/oradata/system01.dbf" datafile 2 auxiliary format "/u01/database/sybo3/oradata/sysaux01.dbf" datafile 3 auxiliary format "/u01/database/sybo3/oradata/undotbs01.dbf" datafile 4 auxiliary format "/u01/database/sybo3/oradata/users01.dbf" datafile 5 auxiliary format "/u01/database/sybo3/oradata/example01.dbf" ; sql 'alter system archive log current'; } executing Memory Script executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting backup at 02-AUG-13 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy input datafile file number=00001 name=/u01/database/sybo3/oradata/system01.dbf output file name=/u01/database/sybo3/oradata/system01.dbf tag=TAG20130802T114457 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:45 channel ORA_DISK_1: starting datafile copy input datafile file number=00002 name=/u01/database/sybo3/oradata/sysaux01.dbf output file name=/u01/database/sybo3/oradata/sysaux01.dbf tag=TAG20130802T114457 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35 channel ORA_DISK_1: starting datafile copy input datafile file number=00005 name=/u01/database/sybo3/oradata/example01.dbf output file name=/u01/database/sybo3/oradata/example01.dbf tag=TAG20130802T114457 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07 channel ORA_DISK_1: starting datafile copy input datafile file number=00003 name=/u01/database/sybo3/oradata/undotbs01.dbf output file name=/u01/database/sybo3/oradata/undotbs01.dbf tag=TAG20130802T114457 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07 channel ORA_DISK_1: starting datafile copy input datafile file number=00004 name=/u01/database/sybo3/oradata/users01.dbf output file name=/u01/database/sybo3/oradata/users01.dbf tag=TAG20130802T114457 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 02-AUG-13 sql statement: alter system archive log current contents of Memory Script: { backup as copy reuse --->該命令塊備份歸檔日誌 archivelog like "/u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_8zpbwsry_.arc" auxiliary format "/u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_%u_.arc" ; catalog clone recovery area; --->並且克隆整個recovery area switch clone datafile all; } executing Memory Script Starting backup at 02-AUG-13 using channel ORA_DISK_1 channel ORA_DISK_1: starting archived log copy input archived log thread=1 sequence=43 RECID=48 STAMP=822397594 output file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_1aog9ikr_.arc RECID=0 STAMP=0 channel ORA_DISK_1: archived log copy complete, elapsed time: 00:00:01 Finished backup at 02-AUG-13 searching for all files in the recovery area List of Files Unknown to the Database ===================================== File Name: /u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_1aog9ikr_.arc cataloging files... cataloging done List of Cataloged Files --->這個地方列出了已經傳送到Auxiliary Server的數據文件,以及歸檔日誌 ======================= File Name: /u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_1aog9ikr_.arc datafile 1 switched to datafile copy input datafile copy RECID=5 STAMP=822397596 file name=/u01/database/sybo3/oradata/system01.dbf datafile 2 switched to datafile copy input datafile copy RECID=6 STAMP=822397596 file name=/u01/database/sybo3/oradata/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=7 STAMP=822397596 file name=/u01/database/sybo3/oradata/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=8 STAMP=822397596 file name=/u01/database/sybo3/oradata/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=9 STAMP=822397596 file name=/u01/database/sybo3/oradata/example01.dbf contents of Memory Script: { set until scn 1234019; recover --->這個命令塊開始recover clone database delete archivelog ; } executing Memory Script executing command: SET until clause Starting recover at 02-AUG-13 using channel ORA_AUX_DISK_1 starting media recovery archived log for thread 1 with sequence 43 is already on disk as file /u01/database/sybo3/fra/SYBO3/archivelog/ 2013_08_02/o1_mf_1_43_1aog9ikr_.arc archived log file name=/u01/database/sybo3/fra/SYBO3/archivelog/2013_08_02/o1_mf_1_43_1aog9ikr_.arc thread=1 sequence=43 media recovery complete, elapsed time: 00:00:00 Finished recover at 02-AUG-13 contents of Memory Script: { shutdown clone immediate; startup clone nomount; --->該命令塊修改參數以及重建控制文件 sql clone "alter system set db_name = ''SYBO3'' comment= ''Reset to original value by RMAN'' scope=spfile"; sql clone "alter system reset db_unique_name scope=spfile"; shutdown clone immediate; startup clone nomount; } executing Memory Script database dismounted Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 376635392 bytes Fixed Size 1336652 bytes Variable Size 285215412 bytes Database Buffers 83886080 bytes Redo Buffers 6197248 bytes sql statement: alter system set db_name = ''SYBO3'' comment= ''Reset to original value by RMAN'' scope=spfile sql statement: alter system reset db_unique_name scope=spfile Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 376635392 bytes Fixed Size 1336652 bytes Variable Size 285215412 bytes Database Buffers 83886080 bytes Redo Buffers 6197248 bytes sql statement: CREATE CONTROLFILE REUSE SET DATABASE "SYBO3" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 SIZE 50 M , GROUP 2 SIZE 50 M , GROUP 3 SIZE 50 M DATAFILE '/u01/database/sybo3/oradata/system01.dbf' CHARACTER SET AL32UTF8 contents of Memory Script: { set newname for tempfile 1 to --->將數據文件,臨時文件更新到控制文件 "/u01/database/sybo3/oradata/temp01.dbf"; switch clone tempfile all; catalog clone datafilecopy "/u01/database/sybo3/oradata/sysaux01.dbf", "/u01/database/sybo3/oradata/undotbs01.dbf", "/u01/database/sybo3/oradata/users01.dbf", "/u01/database/sybo3/oradata/example01.dbf"; switch clone datafile all; } executing Memory Script executing command: SET NEWNAME renamed tempfile 1 to /u01/database/sybo3/oradata/temp01.dbf in control file cataloged datafile copy datafile copy file name=/u01/database/sybo3/oradata/sysaux01.dbf RECID=1 STAMP=822397612 cataloged datafile copy datafile copy file name=/u01/database/sybo3/oradata/undotbs01.dbf RECID=2 STAMP=822397612 cataloged datafile copy datafile copy file name=/u01/database/sybo3/oradata/users01.dbf RECID=3 STAMP=822397612 cataloged datafile copy datafile copy file name=/u01/database/sybo3/oradata/example01.dbf RECID=4 STAMP=822397612 datafile 2 switched to datafile copy input datafile copy RECID=1 STAMP=822397612 file name=/u01/database/sybo3/oradata/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=2 STAMP=822397612 file name=/u01/database/sybo3/oradata/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=3 STAMP=822397612 file name=/u01/database/sybo3/oradata/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=4 STAMP=822397612 file name=/u01/database/sybo3/oradata/example01.dbf contents of Memory Script: { Alter clone database open resetlogs; --->open 數據庫 } executing Memory Script database opened Finished Duplicate Db at 02-AUG-13 f、驗證結果 [oracle@linux4 ~]$ sqlplus / as sysdba SQL> select * from t; NAME ACTION ---------- -------------------- Robinson Transfer DB Jackson Transfer DB by rman SQL> set linesize 190 SQL> select host_name,instance_name from v$instance; HOST_NAME INSTANCE_NAME ------------------------------------ ---------------- linux4.orasrv.com sybo3
五、後記
a、不管使用何種方式進行數據庫克隆,都是使用了基於時間點的不徹底恢復,都須要使用open resetlog方式打開數據庫。
b、從活動數據庫進行克隆時,須要保證Target DB處於歸檔模式。
c、從活動數據庫進行克隆應當保證Target Server與Auxiliary Server 的tnsnames文件中都存在到Target DB與Auxiliary DB的鏈接字符串。
d、能夠在Target Server與Auxiliary Server任意一端發佈duplicate database to newdb from active database進行克隆。
e、從活動數據庫克隆應保證Traget DB與Auxiliary DB具備相同的密碼(位於密碼文件)或者直接從Target Server複製密碼文件到Auxiliary Server。
網絡
相關參考
RMAN 數據庫克隆文件位置轉換方法數據結構
基於RMAN的異機數據庫克隆(rman duplicate)oracle
RMAN duplicate from active 時遭遇 ORA-17627 ORA-12154
Oracle 基於備份控制文件的恢復(unsing backup controlfile)