假设保存数据库文件的硬盘出现了故障,导致当前数据库所有的控制文件、数据文件、联机日志文件都丢失或损坏了,而只剩下备份集和该备份集之后的所有归档日志文件,在这种情况下,由于联机日志文件已经丢失,只能使用不完全恢复,恢复的情况由归档日志文件的完整度决定。现在我们开始来模拟这个实验:
1)首先,备份数据库,待会儿就利用这个备份集来做恢复。
注意这次备份产生2个文件,第一个包含所有的数据文件,第二个包含控制文件和参数文件。
2)准备测试数据,我们向测试表中插入两条数据,第一条的redo已经被归档,而第二条的redo还在联机日志中。
创建测试表:
SQL> create table test (id number);
插入第一条数据:
SQL> insert into test values(1);
SQL> commit;
切换日志使得包含第一天的redo被归档:
SQL>alter system switch logfile;
插入第二条数据,该条数据所对应的redo未被归档:
SQL> insert into test values(2);
SQL> commit;
3)模拟灾难:删除所有的数据文件、控制文件、联机日志文件,且数据库
异常关闭数据库:
SQL> shutdown abort;
删除所有的数据文件,联机日志和控制文件。
4)从备份集中恢复控制文件:
首先启动数据库至nomount状态(可以启动到nomount状态时因为参数文件还在):
RMAN> startup nomount
接着从备份集中恢复控制文件:
5)所有的控制文件都已经恢复成功,现在开始恢复数据文件:
数据文件恢复成功。
6)注册备份集之后产生的归档日志。
由于控制文件时从备份集中恢复过来的,因此控制文件中记录的归档日志是不完整的:
SQL> select name from v$archived_log;
NAME
------------------------------------------------------------------------------
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1043_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1044_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1045_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_ 1046_686537442.ARCH
从上面输出可以看出控制文件记录的最新的归档日志为1046,而在硬盘上还有一个O04DMS0_1_ 1047_686537442.ARCH,这个归档日志是在备份之后产生的,因此未被记录在控制文件中,下面我们用rman提供的catalog命令注册归档日志到控制文件中:
RMAN> catalog archivelog 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_ 1047_686537442.ARCH';
cataloged archive log
archive log filename=H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH recid=1006 stamp=767678151
7)执行不完全恢复
当所有的归档日志都已经注册到控制文件中后,就可以开始执行不完全恢复:
选择AUTO之后,Oracle会自动应用所有的归档日志,知道无法找到为止,出现的ORA-错误都是可以忽略的。
最后以resetlogs方式打开数据库:
SQL> alter database open resetlogs;
SQL> select * from test;
ID
----------
1
查询测试表,发现只有第一条记录,第二天丢失,这和我们之前预测的一样。
1)首先,备份数据库,待会儿就利用这个备份集来做恢复。
RMAN> backup database format'H:\INTEL_DB_DUMPS\O04DMS0\rman\O04DMS0_%U'; Starting backup at 20-NOV-11 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset input datafile fno=00001 name=I:\INTEL_DATA\O04DMS0\SYSTEM01.O04DMS0 input datafile fno=00002 name=I:\INTEL_DATA\O04DMS0\UNDOTBS01.O04DMS0 input datafile fno=00006 name=I:\INTEL_DATA\O04DMS0\SYSAUX01.O04DMS0 input datafile fno=00003 name=I:\INTEL_DATA\O04DMS0\USERS01.O04DMS0 input datafile fno=00004 name=I:\INTEL_DATA\O04DMS0\SECURITY_D.O04DMS0 input datafile fno=00005 name=K:\INTEL_INDEX\O04DMS0\SECURITY_I.O04DMS0 channel ORA_DISK_1: starting piece 1 at 20-NOV-11 channel ORA_DISK_1: finished piece 1 at 20-NOV-11 piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1 tag=TAG20111120T033648 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:37 Finished backup at 20-NOV-11 Starting Control File and SPFILE Autobackup at 20-NOV-11 piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN_F\C-3120696418-20111120-00 comment=NONE Finished Control File and SPFILE Autobackup at 20-NOV-11 |
注意这次备份产生2个文件,第一个包含所有的数据文件,第二个包含控制文件和参数文件。
2)准备测试数据,我们向测试表中插入两条数据,第一条的redo已经被归档,而第二条的redo还在联机日志中。
创建测试表:
SQL> create table test (id number);
插入第一条数据:
SQL> insert into test values(1);
SQL> commit;
切换日志使得包含第一天的redo被归档:
SQL>alter system switch logfile;
插入第二条数据,该条数据所对应的redo未被归档:
SQL> insert into test values(2);
SQL> commit;
3)模拟灾难:删除所有的数据文件、控制文件、联机日志文件,且数据库
异常关闭数据库:
SQL> shutdown abort;
删除所有的数据文件,联机日志和控制文件。
4)从备份集中恢复控制文件:
首先启动数据库至nomount状态(可以启动到nomount状态时因为参数文件还在):
RMAN> startup nomount
接着从备份集中恢复控制文件:
RMAN> restore controlfile from 'H:\INTEL_DB_DUMPS\O04DMS0\RMAN_F\C-3120696418-20111120-00'; Starting restore at 20-NOV-11 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=157 devtype=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:17 output filename=I:\INTEL_DATA\O04DMS0\CONTROL01.O04DMS0 output filename=J:\INTEL_LOG\O04DMS0\CONTROL02.O04DMS0 output filename=K:\INTEL_INDEX\O04DMS0\CONTROL03.O04DMS0 Finished restore at 20-NOV-11 |
5)所有的控制文件都已经恢复成功,现在开始恢复数据文件:
RMAN> sql 'alter database mount'; RMAN> restore database; Starting restore at 20-NOV-11 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile backupset restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set restoring datafile 00001 to I:\INTEL_DATA\O04DMS0\SYSTEM01.O04DMS0 restoring datafile 00002 to I:\INTEL_DATA\O04DMS0\UNDOTBS01.O04DMS0 restoring datafile 00003 to I:\INTEL_DATA\O04DMS0\USERS01.O04DMS0 restoring datafile 00004 to I:\INTEL_DATA\O04DMS0\SECURITY_D.O04DMS0 restoring datafile 00005 to K:\INTEL_INDEX\O04DMS0\SECURITY_I.O04DMS0 restoring datafile 00006 to I:\INTEL_DATA\O04DMS0\SYSAUX01.O04DMS0 channel ORA_DISK_1: reading from backup piece H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1 channel ORA_DISK_1: restored backup piece 1 piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1 tag=TAG20111120T033648 channel ORA_DISK_1: restore complete, elapsed time: 00:00:56 Finished restore at 20-NOV-11 |
数据文件恢复成功。
6)注册备份集之后产生的归档日志。
由于控制文件时从备份集中恢复过来的,因此控制文件中记录的归档日志是不完整的:
SQL> select name from v$archived_log;
NAME
------------------------------------------------------------------------------
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1043_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1044_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1045_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_ 1046_686537442.ARCH
从上面输出可以看出控制文件记录的最新的归档日志为1046,而在硬盘上还有一个O04DMS0_1_ 1047_686537442.ARCH,这个归档日志是在备份之后产生的,因此未被记录在控制文件中,下面我们用rman提供的catalog命令注册归档日志到控制文件中:
RMAN> catalog archivelog 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_ 1047_686537442.ARCH';
cataloged archive log
archive log filename=H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH recid=1006 stamp=767678151
7)执行不完全恢复
当所有的归档日志都已经注册到控制文件中后,就可以开始执行不完全恢复:
SQL> recover database using backup controlfile until cancel; ORA-00279: change 30650218 generated at 11/20/2011 03:36:51 needed for thread 1 ORA-00289: suggestion : H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH ORA-00280: change 30650218 for thread 1 is in sequence #1047 Specify log: {=suggested | filename | AUTO | CANCEL} AUTO ORA-00279: change 30650338 generated at 11/20/2011 03:39:26 needed for thread 1 ORA-00289: suggestion : H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1048_686537442.ARCH ORA-00280: change 30650338 for thread 1 is in sequence #1048 ORA-00278: log file 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH' no longer needed for this recovery ORA-00308: cannot open archived log 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1048_686537442.ARCH' ORA-27041: unable to open file OSD-04002: unable to open file O/S-Error: (OS 2) The system cannot find the file specified. |
选择AUTO之后,Oracle会自动应用所有的归档日志,知道无法找到为止,出现的ORA-错误都是可以忽略的。
最后以resetlogs方式打开数据库:
SQL> alter database open resetlogs;
SQL> select * from test;
ID
----------
1
查询测试表,发现只有第一条记录,第二天丢失,这和我们之前预测的一样。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26277071/viewspace-711640/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26277071/viewspace-711640/