Duplicate的一點總結

lusklusklusk發表於2016-12-02
目標端啟動靜態監聽(源端的tns中關於目標端配置,增加(UR=A)是無效的,因為duplicate過程中會關閉再啟動目標端,關閉的過程中目標端的監聽不再有了,這樣源端連線不到目標端,無法再啟動目標端),目標端例項啟動到nomount狀態

Duplicate命令RMAN 自動執行下列步驟:

 1.為副本資料庫建立控制檔案(所以源端和目標端的db_name可以不一樣,比如源端為A,duplicate到目標端為B)。
 2.Restore 資料檔案到副本資料庫,並透過增量備份和Archived Redo Logs 進行不完全恢復。
 3.重啟輔助例項,以載入伺服器初始化引數檔案即SPFILE
 4.不完全恢復後透過Resetlogs 方式Open 副本資料庫以重建Online Redo Logs(Duplicate ... ForStandby 方式除外,該操作不會開啟資料庫)。
 5.為副本資料庫產生一個新的,唯一的DBID(Duplicate ... For Standby 方式除外,該方式不會建立新的唯一DBID)。


duplicate target database to NPS使用源庫的備份檔案來對目標庫做複製
此時目標庫必須能訪問到源端的備份包(可以把主庫備份檔案複製至備庫,或主備共用儲存,備份包一份,但是再主備都是一樣的儲存路徑),否則在主庫執行duplicate時會報錯說找不到備份包
比如沒有傳輸controlfile備份包,則報找不到控制檔案備份無法restore controlfile
比如沒有傳輸datafile備份包,則報找不到控制檔案備份無法restore datafile
使用備份包即不使用from active時,必須使用密碼連線目標端,如下
rman target / auxiliary sys/lf0320tcsge@WFTST

duplicate target database to NPS from active database使用源庫線上資料來對目標庫做複製
使用from atcive database時,必須使用密碼連線源端和目標端,如下
rman target sys/lf0320tcsge@WF auxiliary sys/lf0320tcsge@WFTST

When you execute DUPLICATE with FROM ACTIVE DATABASE
When you connect RMAN to the source database as TARGET, you must specify a password, even if RMAN uses operating system authentication. The source database must be mounted or open. If the source database is open, then archiving must be enabled. If the source database is not open, then it must have been shut down consistently.
當您使用FROM ACTIVE DATABASE執行DUPLICATE時
將RMAN連線到源資料庫作為TARGET時,即使RMAN使用作業系統身份驗證,也必須指定密碼。 源資料庫必須被安裝或開啟。 如果源資料庫是開啟的,則必須啟用歸檔。 如果源資料庫未開啟,則必須一直關閉源資料庫。



引數DB_FILE_NAME_CONVERT LOGFILE和LOG_FILE_NAME_CONVERT
db_file_name_convert引數僅適用於physical standby和rman duplicate,對logical standby和普通rman restore無效;
log_file_name_convert適用於physical standby和rman duplicate,但是不能用於rman duplicate的run命令中,存在duplicate目標端的spfile檔案中,所以一般在duplicate中加引數logfile

DB_FILE_NAME_CONVERT set on the DUPLICATE command overrides the initialization parameter DB_FILE_NAME_CONVERT (if set). For example, if the initialization parameter file setting is DB_FILE_NAME_CONVERT=('disk1','disk2'), but you execute DUPLICATE ... DB_FILE_NAME_CONVERT ('disk1','disk3'), then RMAN does not convert the disk1 substring to disk2. Instead, RMAN converts the disk1 substring to disk3.
DUPLICATE命令上設定的DB_FILE_NAME_CONVERT將覆蓋初始化引數DB_FILE_NAME_CONVERT(如果已設定)。 例如,如果初始化引數檔案設定為DB_FILE_NAME_CONVERT =('disk1','disk2'),但是您執行DUPLICATE ... DB_FILE_NAME_CONVERT('disk1','disk3'),則RMAN不會將disk1子字串轉換為disk2。 相反,RMAN將disk1子字串轉換為disk3。
LOGFILE:Specifies options for creating online redo logs when creating a duplicate database that is not a standby database

If you do not specify LOGFILE, then RMAN first checks if any of the following initialization parameters are set: LOG_FILE_NAME_CONVERT,DB_CREATE_FILE_DEST, DB_RECOVERY_FILE_DEST or DB_CREATE_ONLINE_LOG_DEST_n. If these parameters are set, RMAN directs duplicate database online redo log files to Oracle managed storage based on these parameter settings. If none of these initialization parameters are set, then RMAN uses the original redo log file names of the source database for redo log files of the duplicate database. You must specify the NOFILENAMECHECK option in this case.
you do not set DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT because you are specifying names for data files and online logs in the RUN command itself
LOGFILE:指定在建立不是standby資料庫的duplicate資料庫時建立聯機重做日誌的選項

如果不指定LOGFILE,則RMAN首先檢查是否設定了以下任何初始化引數:LOG_FILE_NAME_CONVERT,DB_CREATE_FILE_DEST,DB_RECOVERY_FILE_DEST或DB_CREATE_ONLINE_LOG_DEST_n。 如果設定了這些引數,RMAN將根據這些引數設定將duplicate的資料庫聯機重做日誌檔案到oracle的儲存。 如果沒有設定這些初始化引數,則RMAN會使用源資料庫的原始重做日誌檔名作為重複資料庫的重做日誌檔案。 在這種情況下,您必須指定NOFILENAMECHECK選項。
當您在RUN命令本身中指定資料檔案和聯機日誌的名稱,您不要設定DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT引數


引數PFILE
duplicate中引數pfile表示源端使用這個pfile來啟動目標端(一般是從目標端複製到源端來,pfile=/源端路徑/XX.ora)
沒有pfile這個選項時,表示源端直接載入目標端的spfile來啟動目標端
所有如果目標端沒有spfile,而duplicate中又沒有加pfile的選項,則源端會載入目標端一個虛擬的spfile,但是這個spfile實際又不存在(實驗過,目標端show parameter spfile時有一個spfile,但是這個spfile並不實際存在)
Specifies a text-based initialization parameter file used by the auxiliary instance. RMAN automatically shuts down and restarts the auxiliary instance during duplication. If the auxiliary does not use a server parameter file in the default location, then you must specify the text-based initialization parameter file that RMAN should use when starting the auxiliary instance. The initialization parameter file must reside on the same host as the RMAN client used to perform the duplication.
If the auxiliary instance uses a server parameter file in the default location, then you do not need to specify PFILE.
指定輔助例項使用的pfile。 RMAN會在duplicate時自動關閉並重新啟動輔助例項。 如果輔助程式在預設位置不使用伺服器引數檔案,則必須指定啟動輔助例項時RMAN應使用的pfile。 pfile必須位於與用於執行重複的RMAN客戶機相同的主機上。(如果rman在源端開啟,則pfile放在源端上,如果ramn在目標端開啟,則pfile放在目標端上)。如果輔助例項在預設位置使用伺服器引數檔案,則不需要指定PFILE。


引數NOFILENAMECHECK
Prevents RMAN from checking whether the data files and online redo logs files of the source database are in use when the source database files share the same names as the duplicate database files. You are responsible for determining that the duplicate operation does not overwrite useful data.
This option is necessary when you are creating a duplicate database in a different host that has the same disk configuration, directory structure, and file names as the host of the source database. For example, assume that you have a small database located in the /dbs directory of srchost:
/oracle/dbs/system_prod1.dbf
/oracle/dbs/users_prod1.dbf
/oracle/dbs/rbs_prod1.dbf
Assume that you want to duplicate this database to desthost, which has the same file system /oracle/dbs/*, and you want to use the same file names in the duplicate database as in the source database. In this case, specify the NOFILENAMECHECK option to avoid an error message. Because RMAN is not aware of the different hosts, RMAN cannot determine automatically that it should not check the file names.
當源資料庫檔案與duplicate的資料庫檔案使用相同的名稱時,防止RMAN檢查源資料庫的資料檔案和聯機重做日誌檔案是否正在使用。 您有責任確定duplicate操作不會覆蓋源端在用的資料。
在與源資料庫的主機具有相同磁碟配置,目錄結構和檔名的不同主機中建立重複資料庫時,此選項是必需的。 例如,假設您在srchost的/dbs目錄中有一個小資料庫:
/oracle/dbs/system_prod1.dbf
/oracle/dbs/users_prod1.dbf
/oracle/dbs/rbs_prod1.dbf
假設您要將此資料庫複製到目標端,目標端和源端一樣具有相同檔案系統/oracle/dbs/*,並且要在目標端資料庫中的使用和源端相同檔名。 在這種情況下,請指定NOFILENAMECHECK選項以避免出現錯誤訊息。 因為RMAN不知道不同的主機,RMAN無法自動確定不應該檢查檔名




一些duplicate的語法如下
nohup rman target sys/123@WF auxiliary sys/123@WFTST cmdfile=duplicateWF_WFTST.rman msglog=duplicateWF_WFTST.log &

run {
duplicate database PROD incarnation 4 to DEV
pfile=/ebsbak/rmanbackup/duplicate/initDEV.ora
db_file_name_convert=('/db/prod/db/apps_st/','/u01/DEV/db/apps_st/')
LOGFILE
  '/u01/DEV/db/apps_st/data/log01.dbf' size 1024M,
  '/u01/DEV/db/apps_st/data/log02.dbf' size 1024M,
  '/u01/DEV/db/apps_st/data/log03.dbf' size 1024M
NOFILENAMECHECK UNTIL TIME "TO_DATE('2016-11-29 10:00:00','YYYY-MM-DD hh24:mi:ss')";
以上例子(做duplicate時間是29號,源端25號有個0級備份,26號有個1級備份,源端在27號重新生成了一個生命週期5,28號又做了次1級備份了,如果until time到25或26號會報錯源端resetlogs了,until到28號之後則會用到25、26、28的備份包和28號備份以後的歸檔日誌,但是期間生命週期不一樣,加了前面的一個生命週期就正常了)


run {
duplicate target database to NPS from active database NOFILENAMECHECK
pfile=/u01/NPS/db/tech_st/11.2.0/dbs/initNPS.ora
db_file_name_convert=('/u03/PFT/db/apps_st/data/','/u01/NPS/db/apps_st/data/')
LOGFILE
  '/u01/NPS/db/apps_st/data/log01.dbf' size 1024M,
  '/u01/NPS/db/apps_st/data/log02.dbf' size 1024M,
  '/u01/NPS/db/apps_st/data/log03.dbf' size 1024M;
}


run {
duplicate target database to wftst NOFILENAMECHECK UNTIL TIME "TO_DATE('2016-09-05 08:00:00','YYYY-MM-DD hh24:mi:ss')"
db_file_name_convert=('/wfdb/db/oradata/WF','/wfdb/db/oradata/WFTST')
LOGFILE
  '/wfdb/db/oradata/WFTST/log01.dbf' size 50M,
  '/wfdb/db/oradata/WFTST/log02.dbf' size 50M,
  '/wfdb/db/oradata/WFTST/log03.dbf' size 50M;
}


run {
duplicate target database to wftst from active database
db_file_name_convert=('/wfdb/db/oradata/WF','/wfdb/db/oradata/WFTST')
nofilenamecheck;
}


run {
duplicate target database for standby from active database nofilenamecheck;
}


run {
duplicate target database for standby
pfile=/home/oraprod/initPROD.ora
from active database nofilenamecheck;
}



最後,duplicate後目標端的tempfile可能需要重建下,能查詢到select * from dba_temp_files即可
因為使用db_file_name_convert時會在duplicate庫生成一個temp檔案,但是如果duplicate原來的目錄下存在一個這樣名字的temp檔案呢

[oranps@npstest NPS_npstest]$ oerr rman 05541
5541, 1, "no archived logs found in target database"
// *Cause:  Target database was running in archived log mode, but
//          control file did not have any archived log records.
// *Action: Archive current log before retrying command.



一些錯誤案例

from active database源端不使用密碼,有如下會報錯(一開始的連線並沒有報錯,綠色字型顯示)
rman target / auxiliary sys/123456@PLMDB
Recovery Manager: Release 11.2.0.4.0 - Production on Fri Oct 20 20:15:18 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connected to target database: TDB (DBID=2585234821)
connected to auxiliary database: PLMDB (not mounted)
RMAN>duplicate target database to PLMDB from active database NOFILENAMECHECK
...
ORA-17629: Cannot connect to the remote database server
ORA-17627: ORA-01017: invalid username/password; logon denied


duplicate命令中沒有logfile,目標端四個log相關引數為空,直接使用了主庫的logfile,導致報錯(duplicate目標端資料庫的spfile中加了LOG_FILE_NAME_CONVERT就不再報錯了)
源端ONLINE路徑:/db/oracle/oradata/TDB/
目標端這幾個引數都是空:LOG_FILE_NAME_CONVERT,DB_CREATE_FILE_DEST,DB_RECOVERY_FILE_DEST或DB_CREATE_ONLINE_LOG_DEST_n
目標端沒有/db/oracle/oradata/TDB/這個路徑

rman target sys/123456@TDB auxiliary sys/123456@PLMDB
Recovery Manager: Release 11.2.0.4.0 - Production on Fri Oct 20 20:51:00 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connected to target database: TDB (DBID=2585234821)
connected to auxiliary database: PLMDB (not mounted)
RMAN>run {
2> duplicate target database to PLMDB from active database NOFILENAMECHECK
3> db_file_name_convert=('/db/oracle/oradata/TDB/','/mnt/sdb1/u01/app/oracle/oradata/plmdb/','/db/oracle/admin/TDB/dpdump/','/mnt/sdb1/u01/app/oracle/oradata/plmdb/');
4> }
...
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "PLMDB" RESETLOGS ARCHIVELO                                                   G
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP   1 ( '/db/oracle/oradata/TDB/redo01.log' ) SIZE 50 M  REUSE,
  GROUP   2 ( '/db/oracle/oradata/TDB/redo02.log' ) SIZE 50 M  REUSE,
  GROUP   3 ( '/db/oracle/oradata/TDB/redo03.log' ) SIZE 50 M  REUSE
 DATAFILE
  '/mnt/sdb1/u01/app/oracle/oradata/plmdb/system01.dbf'
 CHARACTER SET AL32UTF8
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 10/20/2017 20:44:49
RMAN-05501: aborting duplication of target database
RMAN-06136: ORACLE error from auxiliary database: ORA-01503: CREATE CONTROLFILE failed
ORA-00349: failure obtaining block size for '/db/oracle/oradata/TDB/redo01.log'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9


duplicate命令中直接使用了LOG_FILE_NAME_CONVERT引數
RMAN-01008: the bad identifier was: LOG_FILE_NAME_CONVERT

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2129593/,如需轉載,請註明出處,否則將追究法律責任。

相關文章