RMAN - duplicate DATABASE

目標庫和複製庫環境:
OS: Linux Red Hat AS 4
DB Version: 10.2.0.1
 
1.目標庫和複製庫信息
Rman 中的目標庫(target database)指的是被複制的庫,複製庫(duplicate database)是指複製後生成的新庫.這裏爲了測試方便,複製庫和目標庫的目錄結構設置相同.
 
目標庫:
IP:192.168.30.37
SID:oracl
 
複製庫:
IP:192.168.30.43
SID:oraclbak
 
2.在複製庫上的的操作步驟
執行以下操作的前提是需要安裝oracle軟件(不創建數據庫),需要創建oracle用戶.
 
2.1: 創建密碼文件(注意linux下密碼文件的命名格式是orapw+sid)
[oracle@hxl01 dbs]$cd $ORACLE_HOME/dbs
[oracle@hxl01 dbs]$orapwd file=orapworaclbak password=oracle entries=10 force=y
 
2.2:創建如下目錄
mkdir -p /u01/app/oracle/admin/oracl/adump
mkdir -p /u01/app/oracle/admin/oracl/bdump
mkdir -p /u01/app/oracle/admin/oracl/cdump
mkdir -p /u01/app/oracle/admin/oracl/dpdump
mkdir -p /u01/app/oracle/admin/oracl/pfile
mkdir -p /u01/app/oracle/admin/oracl/udump
mkdir -p /u01/app/oracle/oradata/oracl
mkdir -p /u01/app/oracle/flash_recovery_area
 
2.3:創建spfile文件
將在target上創建的pfile(initoracl.ora,具體創建步驟參考3.1)拷貝到Duplicate,修改參數(*.db_name='oraclbak'),其他跟目標庫保持一致,然後創建spfile.
Sql>connect /as sysdba;
Sql>create spfile from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initoracl.ora';
 
2.4:啓動數據庫到nomount狀態
Sql>startup nomount;
2.5:創建監聽
[oracle@hxl01 dbs]$netca
2.6:配置tnsname
[oracle@hxl01 dbs]$netmgr
注意要配置到複製duplicate庫的連接和到目標target庫的連接.
 
3.在目標庫上的的操作步驟
3.1:創建pfile文件
SQL>create pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initoracl.ora' from spfile;
3.2:將數據庫置於歸檔模式(若數據庫已經在歸檔模式,該步驟可以省略)
Sql>shutdown immediate;
Sql>startup mount;
Sql>alter database archivelog;
sql>alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/duplicate' scope=both;
sql>alter database open;
 
3.3:備份數據庫(我的庫有壞塊,指定了maxcorrupt)
$rman target /
Rman>run{
set maxcorrupt for datafile 5 to 20;
allocate channel dup type disk;
backup format '/u01/app/oracle/duplicate/df_t%t_s%s_p%p' database;
sql 'alter system archive log current';
backup format '/u01/app/oracle/duplicate/al_t%t_s%s_p%p' archivelog all delete input;
release channel dup;
}
 
3.4:傳送文件
將備份好的備份集文件傳送到複製庫的/app/oracle/duplicate/下.

4.複製數據庫
以下操作在複製庫duplicate主機上執行.
[oracle@hxl01 duplicate]$ rman target sys/sys@tar_oracl --(這裏的tar_oracl是在連接到目標庫的tnsname)
RMAN>connect auxiliary sys/oracle@dup_oracl --(這裏的dup_oracl是在連接到複製庫的tnsname)
 
RMAN>run{
duplicate target database to oraclbak nofilenamecheck
logfile group 1 ('/u01/app/oracle/oradata/oracl/redo1_1.log','/u01/app/oracle/oradata/oracl/redo1_2.log') size 512M,
group 2 ('/u01/app/oracle/oradata/oracl/redo2_1.log','/u01/app/oracle/oradata/oracl/redo2_2.log') size 512M,
group 3 ('/u01/app/oracle/oradata/oracl/redo3_1.log','/u01/app/oracle/oradata/oracl/redo3_2.log') size 512M;
}
-- 這裏使用了nofilenamecheck,是因爲複製庫和目標庫的各文件目錄一致.
Starting Duplicate Db at 13-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=156 devtype=DISK

contents of Memory Script:
{
   set until scn  1556049;
   set newname for datafile  1 to
 "/u01/app/oracle/oradata/oracl/system01.dbf";
   set newname for datafile  2 to
 "/u01/app/oracle/oradata/oracl/undotbs01.dbf";
   set newname for datafile  3 to
 "/u01/app/oracle/oradata/oracl/sysaux01.dbf";
   set newname for datafile  4 to
 "/u01/app/oracle/oradata/oracl/users01.dbf";
   set newname for datafile  5 to
 "/u01/app/oracle/oradata/oracl/hxl01.dbf";
   restore
   check readonly
   clone database
   ;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 13-FEB-12
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /u01/app/oracle/oradata/oracl/system01.dbf
restoring datafile 00002 to /u01/app/oracle/oradata/oracl/undotbs01.dbf
restoring datafile 00003 to /u01/app/oracle/oradata/oracl/sysaux01.dbf
restoring datafile 00004 to /u01/app/oracle/oradata/oracl/users01.dbf
restoring datafile 00005 to /u01/app/oracle/oradata/oracl/hxl01.dbf
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/duplicate/df_t775114282_s89_p1
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/duplicate/df_t775114282_s89_p1 tag=TAG20120213T053120
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:47
Finished restore at 13-FEB-12
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ORACL" RESETLOGS ARCHIVELOG
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP  1 ( '/u01/app/oracle/oradata/oracl/redo1_1.log', '/u01/app/oracle/oradata/oracl/redo1_2.log' ) SIZE 512 M ,
  GROUP  2 ( '/u01/app/oracle/oradata/oracl/redo2_1.log', '/u01/app/oracle/oradata/oracl/redo2_2.log' ) SIZE 512 M ,
  GROUP  3 ( '/u01/app/oracle/oradata/oracl/redo3_1.log', '/u01/app/oracle/oradata/oracl/redo3_2.log' ) SIZE 512 M
 DATAFILE
  '/u01/app/oracle/oradata/oracl/system01.dbf'
 CHARACTER SET AL32UTF8


contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script

released channel: ORA_AUX_DISK_1
datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=775102986 filename=/u01/app/oracle/oradata/oracl/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=775102987 filename=/u01/app/oracle/oradata/oracl/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=775102987 filename=/u01/app/oracle/oradata/oracl/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=775102987 filename=/u01/app/oracle/oradata/oracl/hxl01.dbf

contents of Memory Script:
{
   set until scn  1556049;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 13-FEB-12
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=156 devtype=DISK

starting media recovery

channel ORA_AUX_DISK_1: starting archive log restore to default destination
channel ORA_AUX_DISK_1: restoring archive log
archive log thread=1 sequence=47
channel ORA_AUX_DISK_1: restoring archive log
archive log thread=1 sequence=48
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/duplicate/al_t775114352_s91_p1
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/duplicate/al_t775114352_s91_p1 tag=TAG20120213T053230
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:16
archive log filename=/u01/app/oracle/flash_recovery_area/ORACL/archivelog/2012_02_13/o1_mf_1_47_7mj0wydg_.arc thread=1 sequence=47
channel clone_default: deleting archive log(s)
archive log filename=/u01/app/oracle/flash_recovery_area/ORACL/archivelog/2012_02_13/o1_mf_1_47_7mj0wydg_.arc recid=2 stamp=775103016
archive log filename=/u01/app/oracle/flash_recovery_area/ORACL/archivelog/2012_02_13/o1_mf_1_48_7mj0x0qm_.arc thread=1 sequence=48
channel clone_default: deleting archive log(s)
archive log filename=/u01/app/oracle/flash_recovery_area/ORACL/archivelog/2012_02_13/o1_mf_1_48_7mj0x0qm_.arc recid=1 stamp=775103009
media recovery complete, elapsed time: 00:00:09
Finished recover at 13-FEB-12

contents of Memory Script:
{
   shutdown clone;
   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     524288000 bytes

Fixed Size                     1220360 bytes
Variable Size                138412280 bytes
Database Buffers             381681664 bytes
Redo Buffers                   2973696 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ORACL" RESETLOGS ARCHIVELOG
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP  1 ( '/u01/app/oracle/oradata/oracl/redo1_1.log', '/u01/app/oracle/oradata/oracl/redo1_2.log' ) SIZE 512 M ,
  GROUP  2 ( '/u01/app/oracle/oradata/oracl/redo2_1.log', '/u01/app/oracle/oradata/oracl/redo2_2.log' ) SIZE 512 M ,
  GROUP  3 ( '/u01/app/oracle/oradata/oracl/redo3_1.log', '/u01/app/oracle/oradata/oracl/redo3_2.log' ) SIZE 512 M
 DATAFILE
  '/u01/app/oracle/oradata/oracl/system01.dbf'
 CHARACTER SET AL32UTF8


contents of Memory Script:
{
   set newname for tempfile  1 to
 "/u01/app/oracle/oradata/oracl/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/u01/app/oracle/oradata/oracl/undotbs01.dbf";
   catalog clone datafilecopy  "/u01/app/oracle/oradata/oracl/sysaux01.dbf";
   catalog clone datafilecopy  "/u01/app/oracle/oradata/oracl/users01.dbf";
   catalog clone datafilecopy  "/u01/app/oracle/oradata/oracl/hxl01.dbf";
   switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed temporary file 1 to /u01/app/oracle/oradata/oracl/temp01.dbf in control file

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/oracl/undotbs01.dbf recid=1 stamp=775103080

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/oracl/sysaux01.dbf recid=2 stamp=775103081

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/oracl/users01.dbf recid=3 stamp=775103083

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/oracl/hxl01.dbf recid=4 stamp=775103084

datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=775103080 filename=/u01/app/oracle/oradata/oracl/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=775103081 filename=/u01/app/oracle/oradata/oracl/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=775103083 filename=/u01/app/oracle/oradata/oracl/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=775103084 filename=/u01/app/oracle/oradata/oracl/hxl01.dbf

contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 13-FEB-12
 

小插曲:
數據庫打開後使用sysdba登陸提示ORA-01031: insufficient privileges,找了半天原因是密碼文件命名問題, 之前創建密碼文件名爲orapwdoraclbak,將其修改爲orapworaclbak,問題解決,注意在linux下密碼文件的命名格式爲orapw+sid.
SQL> connect
sys/oracle@dup_oracl
as sysdba
ERROR:
ORA-01031: insufficient privileges
 
常見問題:
1.恢復的時候找不到某個歸檔日誌
在複製數據庫恢復的過程中找不到具體某個歸檔日誌會報如下錯誤:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 02/14/2012 01:01:41
RMAN-03015: error occurred in stored script Memory Script
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of log thread 1 seq 53 lowscn 1597845 found to restore
 
這個時候需要將目標庫的該歸檔日誌拷貝過來或是在做複製的時候使用set until指定具體恢復到某個sequence或是scn,如:
 
run{
SET until sequence 52;
duplicate target database to oraclbak nofilenamecheck
logfile group 1 ('/u01/app/oracle/oradata/oracl/redo1_1.log','/u01/app/oracle/oradata/oracl/redo1_2.log') size 512M,
group 2 ('/u01/app/oracle/oradata/oracl/redo2_1.log','/u01/app/oracle/oradata/oracl/redo2_2.log') size 512M,
group 3 ('/u01/app/oracle/oradata/oracl/redo3_1.log','/u01/app/oracle/oradata/oracl/redo3_2.log') size 512M;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章