Scenario : The standby site is crashed or unavailable and need to restore from another standby without touching the primary site. This post also will be useful who wants to duplicate the standby site from primary database backup on data guard environment.
The below steps are worked well on my production environment. But i do not recommend to use the below script in your environment unless you change the scripts(instance name, DB name, host name, directory name etc) and test in test environment.
For security reason, i used XXXXX for hiding my host name, instance name, directory names. Also i am using DEVDB for hiding the instance name.
My instance names are devdb12(primary), devdb12_dg(first standby), devdb12_dr(second standby). Now devdb12_dg is crashed or unavailable. The goal is to restore devdb12_dg from other standby site(devdb12_dr). My environment has no ASM disks.
Prerequisite :
Oracle software should be installed and version should be same as other site.
The directory structure and file system size should be same as other site.
The below steps are worked well on my production environment. But i do not recommend to use the below script in your environment unless you change the scripts(instance name, DB name, host name, directory name etc) and test in test environment.
For security reason, i used XXXXX for hiding my host name, instance name, directory names. Also i am using DEVDB for hiding the instance name.
My instance names are devdb12(primary), devdb12_dg(first standby), devdb12_dr(second standby). Now devdb12_dg is crashed or unavailable. The goal is to restore devdb12_dg from other standby site(devdb12_dr). My environment has no ASM disks.
Prerequisite :
Oracle software should be installed and version should be same as other site.
The directory structure and file system size should be same as other site.
Step 1
Create pfile from spfile on working standby site and copy to new standby site. Modify the pfile parameter(instance name, DG parameter etc) according to new standby location. Copy the password file, wallet file from standby location to new standby location.
Step 2
Take L0 backup on working standby site and copy the RMAN backup files to new standby site. I am backing up the RMAN backup files under /backup file system. We will have to copy the backup files to same file system(/backup) on the new standby site. If you do not have same file system in new standby site, then you have to use the BACKUP LOCATION option on the restore command. Please review this link to find details for different options.
Sample RMAN backup script is as below. DO NOT USE this in your environment without making the changes(directory location, instance name etc). I am using 8 channel for RMAN backup. However, i will let you choose the number of channel according to your server CPU power. We can also restore the database from tape.. please refer this link just in case if you don't prefer to backup the database in working standby site. Restore from tape.
Sample RMAN backup script is as below. DO NOT USE this in your environment without making the changes(directory location, instance name etc). I am using 8 channel for RMAN backup. However, i will let you choose the number of channel according to your server CPU power. We can also restore the database from tape.. please refer this link just in case if you don't prefer to backup the database in working standby site. Restore from tape.
ORACLE_BASE=/ora/app/oracle
ORACLE_HOME=/ora/app/oracle/product/11.1.0/db_1
ORACLE_SID=XXXXXXX
RMAN_SCRIPT=/ora/app/oracle/admin/XXXXXXX/rman
BACKUP_LOG_PATH=$RMAN_SCRIPT/logs
MAIL_TO_1=XXXXX@XXXX.com
export ORACLE_BASE
export ORACLE_HOME
export ORACLE_SID
export RMAN_SCRIPT
export BACKUP_LOG_PATH
export MAIL_TO_1
DT=`date "+%m%d%Y_%H%M"`
LOG_FILE=${BACKUP_LOG_PATH}/bckp_level_0_${ORACLE_SID}_${DT}.log
export TODAY=`date +%Y%m%d'_'%H%M`
export TAG=`echo ${ORACLE_SID}_L0_${TODAY}`
export HOSTNAME=`hostname`
$ORACLE_HOME/bin/rman msglog=${LOG_FILE} << EOF
connect target;
run
{
ALLOCATE CHANNEL T01 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T02 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T03 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T04 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T05 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T06 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T07 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
ALLOCATE CHANNEL T08 TYPE DISK FORMAT '/dbbackup/XXXXXXX/%d_L0_${TODAY}_%s_%U_%t';
SET COMMAND ID TO 'LEVEL0 BACKUP';
CROSSCHECK BACKUP;
DELETE NOPROMPT OBSOLETE;
BACKUP INCREMENTAL LEVEL 0 AS COMPRESSED BACKUPSET DATABASE TAG=${TAG};
BACKUP FORMAT '/dbbackup/XXXXXXX/%d_SPFILE_${TODAY}_%s_%U_%t' SPFILE TAG=${TAG};
BACKUP FORMAT '/dbbackup/XXXXXXX/%d_CTRL_${TODAY}_%s_%U_%t' CURRENT CONTROLFILE TAG=${TAG};
RELEASE CHANNEL T01;
RELEASE CHANNEL T02;
RELEASE CHANNEL T03;
RELEASE CHANNEL T04;
RELEASE CHANNEL T05;
RELEASE CHANNEL T06;
RELEASE CHANNEL T07;
RELEASE CHANNEL T08;
host "cp /ora/app/oracle/admin/XXXXXXX/wallet/ewallet.p12 /dbbackup/XXXXXXX/ewallet.p12_`date +%m%d%y%H%M%S`";
host "cp /ora/app/oracle/admin/XXXXXXX/wallet/cwallet.sso /dbbackup/XXXXXXX/cwallet.sso_`date +%m%d%y%H%M%S`";
}
exit;
EOF
ERRM="RMAN-00569"
cat ${LOG_FILE} | grep "${ERRM}" > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
SUBJ="RMAN Level 0 Backup Failed ${ORACLE_SID} at ${HOSTNAME}"
mailx -s "${SUBJ}" ${MAIL_TO_1} < ${LOG_FILE}
else
SUBJ="RMAN Level 0 Backup Successful ${ORACLE_SID} at ${HOSTNAME}"
mailx -s "${SUBJ}" ${MAIL_TO_1} < ${LOG_FILE}
fi
Step 3 Make sure, all the directories in new standby site is same as other node.
Step 4 Start the instance without mounting.
startup nomount pfile= initdevdb12_dg.ora
Step 5 Create spfile and start the instance again with spfile
create spfile from pfile= spfiledevdb12_dg.ora
shutdown immediate;
startup nomount;
Step 6 Check the RMAN connection between new standby to working standby site. This script will make sure, no connection issues between two sites. Make sure, you setup tnsnames.ora, listener.ora file on new standby site. Auxiliary site(XXXXXXX_dg) is new standby site. Target site(XXXXXXX_dr) is existing standby site.
DT=`date +%Y%m%d_%H%M%S`
export DT
$ORACLE_HOME/bin/rman msglog=rman_create_standby_XXXXXXX_dg1_${DT}.log <
connect target sys/password@XXXXXXX_dr
connect auxiliary sys/password@XXXXXXX_dg
run
{
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate channel prmy5 type disk;
allocate channel prmy6 type disk;
allocate channel prmy7 type disk;
allocate channel prmy8 type disk;
allocate auxiliary channel stby1 type disk;
allocate auxiliary channel stby2 type disk;
allocate auxiliary channel stby3 type disk;
allocate auxiliary channel stby4 type disk;
allocate auxiliary channel stby5 type disk;
allocate auxiliary channel stby6 type disk;
allocate auxiliary channel stby7 type disk;
allocate auxiliary channel stby8 type disk;
}
exit
EOF
Step 7 Restore the new standby. Auxiliary site is new standby site. Target site is existing standby site.
file name : rman_standby_to_standby.sh
You need to run the script in background mode.. In my production environment, it took 10 hours to complete with 8 Channel. My database size was 10TB.
file name : rman_standby_to_standby.sh
You need to run the script in background mode.. In my production environment, it took 10 hours to complete with 8 Channel. My database size was 10TB.
DT=`date +%Y%m%d_%H%M%S`
export DT
$ORACLE_HOME/bin/rman msglog=rman_create_standby_XXXXXXX_dg_${DT}.log <
connect target sys/password@XXXXXXX_dr
connect auxiliary sys/password@XXXXXXX_dg
run
{
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate channel prmy5 type disk;
allocate channel prmy6 type disk;
allocate channel prmy7 type disk;
allocate channel prmy8 type disk;
allocate auxiliary channel stby1 type disk;
allocate auxiliary channel stby2 type disk;
allocate auxiliary channel stby3 type disk;
allocate auxiliary channel stby4 type disk;
allocate auxiliary channel stby5 type disk;
allocate auxiliary channel stby6 type disk;
allocate auxiliary channel stby7 type disk;
allocate auxiliary channel stby8 type disk;
DUPLICATE TARGET DATABASE FOR STANDBY DORECOVER NOFILENAMECHECK;
}
exit
EOF
The restore log file should be as below.
Note : The log file size is huge and several pages. Hence i trimmed the log file size to smaller. I removed many lines in the middle of log file.
Note : The log file size is huge and several pages. Hence i trimmed the log file size to smaller. I removed many lines in the middle of log file.
RMAN – log of rman_standby_to_standby.sh
Recovery Manager: Release 11.1.0.7.0 - Production on Fri Jan 11 16:54:37 2013 Copyright (c) 1982, 2007, Oracle. All rights reserved. RMAN> RMAN> connected to target database: XXXXXXX (DBID=1081194209) RMAN> connected to auxiliary database: XXXXXXX (not mounted) RMAN> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> using target database control file instead of recovery catalog allocated channel: prmy1 channel prmy1: SID=995 device type=DISK allocated channel: prmy2 channel prmy2: SID=916 device type=DISK allocated channel: prmy3 channel prmy3: SID=920 device type=DISK allocated channel: prmy4 channel prmy4: SID=908 device type=DISK allocated channel: prmy5 channel prmy5: SID=909 device type=DISK allocated channel: prmy6 channel prmy6: SID=914 device type=DISK allocated channel: prmy7 channel prmy7: SID=917 device type=DISK allocated channel: prmy8 channel prmy8: SID=919 device type=DISK allocated channel: stby1 channel stby1: SID=1085 device type=DISK allocated channel: stby2 channel stby2: SID=1105 device type=DISK allocated channel: stby3 channel stby3: SID=1080 device type=DISK allocated channel: stby4 channel stby4: SID=1079 device type=DISK allocated channel: stby5 channel stby5: SID=1078 device type=DISK allocated channel: stby6 channel stby6: SID=1084 device type=DISK allocated channel: stby7 channel stby7: SID=1083 device type=DISK allocated channel: stby8 channel stby8: SID=1082 device type=DISK Starting Duplicate Db at 01/11/2013 16:54:50 contents of Memory Script: { set until scn 51178358684; restore clone standby controlfile; sql clone 'alter database mount standby database'; } executing Memory Script executing command: SET until clause Starting restore at 01/11/2013 16:55:15 channel stby1: starting datafile backup set restore channel stby1: restoring control file channel stby1: reading from backup piece /dbbackup/XXXXXXX/XXXXXXX_CTRL_20130110_2315_3526_e6nv4cje_1_1_804401774 channel stby1: piece handle=/dbbackup/XXXXXXX/XXXXXXX_CTRL_20130110_2315_3526_e6nv4cje_1_1_804401774 tag=XXXXXXX_L0_20130110_2315 channel stby1: restored backup piece 1 channel stby1: restore complete, elapsed time: 00:00:03 output file name=/data01/oradata/XXXXXXX/control01.ctl output file name=/data02/oradata/XXXXXXX/control02.ctl output file name=/data03/oradata/XXXXXXX/control03.ctl Finished restore at 01/11/2013 16:55:19 sql statement: alter database mount standby database contents of Memory Script: { set until scn 51178358684; set newname for tempfile 1 to "/orasys/oradata/XXXXXXX/temp01.dbf"; set newname for tempfile 2 to "/orasys/oradata/XXXXXXX/temp02.dbf"; set newname for tempfile 3 to switch clone tempfile all; set newname for datafile 1 to "/orasys/oradata/XXXXXXX/system01.dbf"; set newname for datafile 2 to "/orasys/oradata/XXXXXXX/sysaux01.dbf"; set newname for datafile 3 to "/undo/oradata/XXXXXXX/undotbs01.dbf"; set newname for datafile 4 to "/undo/oradata/XXXXXXX/undotbs02.dbf"; set newname for datafile 5 to "/orasys/oradata/XXXXXXX/users01.dbf"; set newname for datafile 6 to "/orasys/oradata/XXXXXXX/db_audit_f01.dbf"; set newname for datafile 7 to "/data01/oradata/XXXXXXX/XXXXXX01_SMALL_F01.dbf"; set newname for datafile 8 to "/data02/oradata/XXXXXXX/XXXXXX01_SMALL_F02.dbf"; set newname for datafile 225 to "/data08/oradata/XXXXXXX/XXXXXX11_TRANSHISTORY_INDX_F39.dbf"; set newname for datafile 226 to "/data11/oradata/XXXXXXX/XXXXXX08_TRANSPROC_INDX_F18.dbf"; restore clone database ; } executing Memory Script executing command: SET until clause executing command: SET NEWNAME executing command: SET NEWNAME renamed tempfile 1 to /orasys/oradata/XXXXXXX/temp01.dbf in control file renamed tempfile 2 to /orasys/oradata/XXXXXXX/temp02.dbf in control file renamed tempfile 3 to /data14/oradata/XXXXXXX/temp03.dbf in control file renamed tempfile 4 to /data15/oradata/XXXXXXX/temp04.dbf in control file renamed tempfile 5 to /data16/oradata/XXXXXXX/temp05.dbf in control file executing command: SET NEWNAME executing command: SET NEWNAME Starting restore at 01/11/2013 16:55:39 channel stby1: starting datafile backup set restore channel stby1: specifying datafile(s) to restore from backup set channel stby1: restoring datafile 00006 to /orasys/oradata/XXXXXXX/db_audit_f01.dbf channel stby1: restoring datafile 00028 to /data07/oradata/XXXXXXX/XXXXXX03_LARGE_F09.dbf channel stby1: restoring datafile 00128 to handle=/dbbackup/XXXXXXX/XXXXXXX_L0_20130110_2315_3515_drnv48r5_1_1_804397925 tag=XXXXXXX_L0_20130110_2315 channel stby3: restored backup piece 1 channel stby3: restore complete, elapsed time: 00:57:32 channel stby4: piece handle=/dbbackup/XXXXXXX/XXXXXXX_L0_20130110_2315_3518_dunv49es_1_1_804398556 tag=XXXXXXX_L0_20130110_2315 channel stby4: restored backup piece 1 channel stby4: restore complete, elapsed time: 00:56:46 Finished restore at 01/11/2013 22:29:55 contents of Memory Script: { switch clone datafile all; } executing Memory Script datafile 1 switched to datafile copy input datafile copy RECID=21 STAMP=804465000 file name=/orasys/oradata/XXXXXXX/system01.dbf datafile 2 switched to datafile copy input datafile copy RECID=22 STAMP=804465000 file name=/orasys/oradata/XXXXXXX/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=23 STAMP=804465000 file name=/undo/oradata/XXXXXXX/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=24 STAMP=804465000 file name=/undo/oradata/XXXXXXX/undotbs02.dbf datafile 5 switched to datafile copy input datafile copy RECID=25 STAMP=804465000 file name=/orasys/oradata/XXXXXXX/users01.dbf datafile 6 switched to datafile copy input datafile copy RECID=26 STAMP=804465000 file name=/orasys/oradata/XXXXXXX/db_audit_f01.dbf datafile 7 switched to datafile copy input datafile copy RECID=27 STAMP=804465001 file name=/data01/oradata/XXXXXXX/XXXXXX01_SMALL_F01.dbf datafile 8 switched to datafile copy input datafile copy RECID=28 STAMP=804465001 file name=/data02/oradata/XXXXXXX/XXXXXX01_SMALL_F02.dbf datafile 9 switched to datafile copy input datafile copy RECID=29 STAMP=804465001 file name=/data03/oradata/XXXXXXX/XXXXXX02_MEDIUM_F01.dbf datafile 10 switched to datafile copy name=/data11/oradata/XXXXXXX/XXXXXX08_TRANSPROC_INDX_F18.dbf contents of Memory Script: { set until scn 51178358684; recover standby clone database delete archivelog ; } executing Memory Script executing command: SET until clause Starting recover at 01/11/2013 22:30:27 starting media recovery Oracle Error: ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORA-01194: file 1 needs more recovery to be consistent ORA-01110: data file 1: '/orasys/oradata/XXXXXXX/system01.dbf' released channel: prmy1 released channel: prmy2 released channel: prmy3 released channel: prmy4 released channel: prmy5 released channel: prmy6 released channel: prmy7 released channel: prmy8 released channel: stby1 released channel: stby2 released channel: stby3 released channel: stby4 released channel: stby5 released channel: stby6 released channel: stby7 released channel: stby8 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of Duplicate Db command at 01/11/2013 22:31:08 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 archived log for thread 1 with sequence 90545 and starting SCN of 51178331763 found to restore RMAN-06025: no backup of archived log for thread 1 with sequence 90544 and starting SCN of 51178280286 found to restore RMAN-06025: no backup of archived log for thread 1 with sequence 90543 and starting SCN of 51178228751 found to restore RMAN-06025: no backup of archived log for thread 1 with sequence 90542 and starting SCN of 51178172350 found to restore RMAN-06025: no backup of archived log for thread 1 with sequence 90541 and starting SCN of 51178116145 found to restore RMAN-06025: no backup of archived log for thread 1 with sequence 90430 and starting SCN of 51172378542 found to restore RMAN> Recovery Manager complete. |
Step 8 Copy the archive logs from sequence# 90430 to sequence# 90550 (actually only up to 90545). Use SCP to Copy the archive log from working standby(devdb12_dr) to devdb12_dg site.
Step 9 Recover the database.
Standby database is in mount state
alter database recover standby database until cancel
You may want to give few archive log files manually and then put AUTO for recovery Watch alert log in another window
It will recover standby database until last archive log file which is in as defined by parameter log_archive_dest_1 - in our case it was /dbArch01/XXXXXXX and media recovery will fail – this is expected
Step 10 Make the changes on Data Guard Parameter on primary as well as other standby.
You need to change the parameter according to your environment.
You need to change the parameter according to your environment.
On new standby(devdb12_dg) :
alter system set db_unique_name='devdb12_dg' scope=spfile;
alter system set instance_name='devdb12_dg' scope=spfile;
alter system set log_archive_dest_2 = 'SERVICE=devdb12 LGWR ASYNC DB_UNIQUE_NAME=devdb12 VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set log_archive_dest_3 = 'SERVICE=devdb12_dr LGWR ASYNC DB_UNIQUE_NAME=devdb12_dr VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set log_archive_config = 'dg_config=(devdb12,devdb12_dg,devdb12_dr)';
alter system set log_archive_config = 'dg_config=(devdb12,devdb12_dg,devdb12_dr)';
alter system set log_archive_dest_state_4 = 'ENABLE';
alter system set standby_file_management = 'AUTO';
alter system set log_archive_max_processes=5;
alter system set fal_client=devdb12_dg;
alter system set fal_server=devdb12,devdb12_dr ;
On working standby(devdb12_dr) :
alter system set log_archive_config = 'DG_CONFIG=(devdb12,devdb12_dg,devdb12_dr)' scope=both;
alter system set log_archive_dest_2 = 'SERVICE=devdb12_dg LGWR ASYNC DB_UNIQUE_NAME=devdb12_dg VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set log_archive_dest_3 = 'SERVICE=devdb12 LGWR ASYNC DB_UNIQUE_NAME=devdb12 VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set log_archive_max_processes=5;alter system set fal_client=devdb12_dr;
alter system set fal_server=devdb12_dg,devdb12 scope=both;
alter system switch logfile;
On Primary(devdb12) :
alter system set log_archive_config = 'DG_CONFIG=(devdb12,devdb12_dg,devdb12_dr)' scope=both;
alter system set log_archive_dest_2 = 'SERVICE=devdb12_dg LGWR ASYNC DB_UNIQUE_NAME=devdb12_dg VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set log_archive_dest_3 = 'SERVICE=devdb12_dr LGWR ASYNC DB_UNIQUE_NAME=devdb12_dr VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)';
alter system set fal_client=devdb12;
alter system set fal_server=devdb12_dg,devdb12_dr scope=both;
alter system switch logfile;
Step 11 Create the temp file same as other standby node.
alter tablespace temp add tempfile '/oratemp01/oradata/XXXXXXX/temp01.dbf' size 16G;
Step 12 Create the standby redo log file same as other standby node.
Create standby logs on new standby database – by default oracle will create one standby redo log – which you can drop
alter database drop STANDBY LOGFILE GROUP 6; ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/redo01/oradata/XXXXXXX/std_redo01.log') SIZE 300M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/redo02/oradata/XXXXXXX/std_redo02.log') SIZE 300M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/redo03/oradata/XXXXXXX/std_redo03.log') SIZE 300M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 9 ('/redo01/oradata/XXXXXXX/std_redo04.log') SIZE 300M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 ('/redo02/oradata/XXXXXXX/std_redo05.log') SIZE 300M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 ('/redo03/oradata/XXXXXXX/std_redo06.log') SIZE 300M; |
Step 13 Shutdown the database and open in read mode. Watch the alert log on separate window.
shutdown immediate;
startup nomount;
alter database mount standby database;
-- The below three lines are related to wallet. The below three lines can be ignored if you are not using the wallet.
select * from v$encryption_wallet;
select * from v$encryption_wallet;
alter system set wallet open iddentified by "XXXX";
select * from v$encryption_wallet;
alter database recover managed standby database disconnect from session;
alter database recover managed standby database cancel;
alter database open;
alter database recover managed standby database using current logfile disconnect;
Hope this post helps! Please provide your comments and feedback!
Hope this post helps! Please provide your comments and feedback!
No comments:
Post a Comment