Tuesday 29 June 2010

RMAN Disaster recovery, on different host

Disaster recovery (or clone db) using RMAN on different host.

- Basic version: This will restore .dbf, .ctl & .log to original location and assumes the rman backup in are in same location.
- Advance version: Marked as optional steps, restore all db files to different location and rman backup are in different location.

Summary of RMAN Disaster recovery

1. Export the SID
2. Create the folders [?dump, oradata, arch]
3. Startup nomount
4. Restore spfile
5. (optional) Change the .ctl + archive location, using pfile
6. Restore control file
7. Force mount the database
8. (optional) Catalog the backup file
9. (optional) Rman 'set newname' for restore file
10. restore database;
11. (optional) rename datafiles
12. recover database;
13. alter database open resetlogs;
14. Take a new backup of database


1. Export the SID

$ export ORACLE_SID=PRDB1

2. Create the folders [?dump, oradata, arch]

mkdir /u01/oracle/admin/PRDB1
mkdir /u01/oracle/admin/PRDB1/adump
mkdir /u01/oracle/admin/PRDB1/bdump
mkdir /u01/oracle/admin/PRDB1/cdump
mkdir /u01/oracle/admin/PRDB1/udump

mkdir /u01/oracle/oradata/PRDB1
mkdir /u11/oracle/oradata/PRDB1
mkdir /u21/oracle/oradata/PRDB1
mkdir /u31/oracle/arch_PRDB1


3. Startup nomount

$ rman target /

RMAN> startup nomount;

-- Will give you error, and say can't open initPRDB1.ora


4. Restore spfile

RMAN> restore spfile from '/mnt/restore/PRDB1_cf_c-1795524320-20100511-00';


5. (optional) Change the .ctl + archive location, using pfile

$ cd $ORACLE_HOME/dbs
$ strings spfilePRDB1.ora > initPRDB1.ora
$ mv spfilePRDB1.ora xxspfilePRDB1.oraxx
RMAN> shutdown immediate;
RMAN> startup nomount;

-- Modify the *.control_files and *.log_arc parameters (e.g. all go to /u01)


6. Restore control file

RMAN> restore controlfile from '/mnt/restore/PRDB1_cf_c-1795524320-20100511-00';


7. Force mount the database

RMAN> startup force mount;


8. (optional) Catalog the backup file

RMAN> catalog start with '/mnt/restore';


9. (optional) RMAN 'set newname' for restore file, restore to different location, needs to be done before the restore command.

set line 150
set pagesize 100
col NEW_FILE_NAME for a100
select 'set newname for datafile ' || FILE_ID || ' to ' || ''''|| FILE_NAME || ''';'
as NEW_FILE_NAME from dba_data_files;

select 'set newname for tempfile ' || FILE_ID || ' to ' || ''''|| FILE_NAME || ''';'
as NEW_FILE_NAME from dba_temp_files;


run {
set newname for datafile 1 to '/u31/oracle/oradata/PRDB1/system01.dbf';
set newname for datafile 2 to '/u31/oracle/oradata/PRDB1/undotbs01.dbf';
...
set newname for datafile 9 to '/u31/oracle/oradata/PRDB1/PRDB1_BLOB_DATA_02.dbf';
set newname for datafile 10 to '/u31/oracle/oradata/PRDB1
...
set newname for datafile 19 to '/u31/oracle/oradata/PRDB1/PRDB1_BLOB_DATA_11.dbf';

set newname for tempfile 1 to '/u31/oracle/oradata/PRDB1/temp01.dbf';

restore database;
}


10. Restore database

RMAN> restore database;


11. (optional) rename datafiles, Use below to restore to different location, needs to be done before the recover command.

set line 150
set pagesize 100
col RENAME_SQL for 150
-- data files
select 'alter database rename file '''|| NAME || ''' to ' || ''''|| NAME || ''';'
as RENAME_SQL from v$datafile;

-- redo logs
select 'alter database rename file '''|| NAME || ''' to ' || ''''|| NAME || ''';'
as RENAME_SQL from v$tempfile;

-- temp files
select 'alter database rename file ''' || lf.MEMBER || ''' to ''' || lf.MEMBER || ''';'
as RENAME_SQL from v$logfile lf, v$log l where l.group# = lf.group#;


-- Run above output via SqlPLus session
...
...
alter database rename file '/u02/oracle/oradata/PRDB1/redo02.log'
to '/u01/oracle/oradata/PRDB1/redo02.log';
alter database rename file '/u31/oracle/oradata/PRDB1/redo03.log'
to '/u01/oracle/oradata/PRDB1/redo03.log';


12. Recover database

RMAN> recover database;

-- Will give error since can't find 'unable to find archive log'


13. Open database, reset log

RMAN> alter database open resetlogs;


14. Take a new backup of database

RMAN> backup database;




Reference
=========
Below sites came useful in doing this (Backup and Recovery Reference, chap RESET DATABASE)
http://users.telenet.be/oraguy.be/make_a_clone_of_your_database_1.htm
http://www.oracle-base.com/articles/9i/DuplicateDatabaseUsingRMAN9i.php
http://kamranagayev.wordpress.com/2010/03/29/rman-video-tutorial-series-performing-disaster-recovery-with-rman/
http://download-uk.oracle.com/docs/cd/B19306_01/backup.102/b14191/rcmtroub004.htm