在Oracle数据恢复情景2的前两篇中,我模拟的情况都是删除current redo log,基本上都是删除部分的redo logs,如果将DB中的所有redo logs全部删除呢?
DB version: Release 11.2.0.2.0
1.查看online redo logs
SQL> select t1.GROUP#,t1.MEMBER,t1.TYPE,t2.STATUS,t2.bytes from v$logfile t1,v$log t2 where t1.GROUP#=t2.GROUP#;GROUP# MEMBER TYPE STATUS BYTES------ ---------------------------------------- -------- -------- ---------- 3 /opt/oracle/oradata/ora/redo03.log ONLINE CURRENT 52428800 2 /opt/oracle/oradata/ora/redo02.log ONLINE INACTIVE 52428800 1 /opt/oracle/oradata/ora/redo01.log ONLINE INACTIVE 52428800
2.删除数据
SQL> @del.sqlSQL> select count(1) from UAS.DBA_TEMP1; COUNT(1)---------- 71000
3.移除所有redo logs
$ mv redo0* ..
4.试着日志切换,竟然也执行成功了
SQL> alter system switch logfile;System altered.SQL> alter system switch logfile;System altered.SQL> alter system switch logfile; --hanging...alter system switch logfile*ERROR at line 1:ORA-01013: user requested cancel of current operation
5.恢复
SQL> alter database clear unarchived logfile group 1;Database altered.SQL> alter database clear unarchived logfile group 3;Database altered.SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-01624: log 2 needed for crash recovery of instance ora (thread 1)
ORA-00312: online log 2 thread 1: '/opt/oracle/oradata/ora/redo02.log'
此错误的解决方法是对DB做一下checkpoint:
SQL> ALTER SYSTEM CHECKPOINT GLOBAL;SQL> alter database clear unarchived logfile group 2;Database altered.SQL> alter system switch logfile;System altered.SQL> alter system switch logfile;System altered.SQL> alter system switch logfile;System altered.SQL> select t1.GROUP#,t1.MEMBER,t1.TYPE,t2.STATUS,t2.bytes from v$logfile t1,v$log t2 where t1.GROUP#=t2.GROUP#;GROUP# MEMBER TYPE STATUS BYTES------ ---------------------------------------- -------- -------- ---------- 3 /opt/oracle/oradata/ora/redo03.log ONLINE CURRENT 52428800 2 /opt/oracle/oradata/ora/redo02.log ONLINE INACTIVE 52428800 1 /opt/oracle/oradata/ora/redo01.log ONLINE INACTIVE 52428800
6.检查数据
SQL> select count(1) from UAS.DBA_TEMP1; COUNT(1)---------- 71000