这里要分成两种情况,一种是数据库正常关闭,一种是数据库异常关闭。
如果数据库是正常关闭的,由于此时数据库已经完成了检查点,所有提交的事务都已经被写入到数据文件中,所以不存在数据丢失,当前日志在实例恢复中不再需要,那么我们可以直接使用clear来对丢失的日志文件进行重建。
如果数据库是异常关闭的,那么oracle在进行实例恢复时必然要用到当前的日志文件,否则oracle无法保证提交的数据不丢失。在这种情况下,oracle将无法启动。
在这种情况下,我们需要使用备份的数据文件,从备份中恢复数据文件,再利用归档日志文件向前推演,知道最后一个完好的日志文件,然后通过resetlogs打开数据库。此时还是会丢失数据,丢失的数据就是丢失的当前的日志文件中的数据。下面我们演示一下这种情况:
查看当前日志组:
SQL> select group#,members,status from v$log;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 1 UNUSED
2 1 INACTIVE
3 1 CURRENT
SQL> create table h2(id int);
Table created.
SQL> begin
2 for i in 1..1000000
3 loop
4 insert into h2 values(i);
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
切换到sys用户并且模拟数据库异常关闭:
SQL> shutdown abort;
ORACLE instance shut down.
[oracle@localhost orcl]$ ls
control01.ctl hh01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf
example01.dbf redo01.log redo03.log system01.dbf undotbs01.dbf
[oracle@localhost orcl]$ mv ./redo03.log /test
SQL> startup
ORACLE instance started.
Total System Global Area 849530880 bytes
Fixed Size 1339824 bytes
Variable Size 520097360 bytes
Database Buffers 322961408 bytes
Redo Buffers 5132288 bytes
Database mounted.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
查看警报日志文件:
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_28519.trc:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
SQL> select group#,members,status from v$log;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 1 ACTIVE
3 1 ACTIVE
2 1 CURRENT
SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR at line 1:
ORA-01624: log 3 needed for crash recovery of instance orcl (thread 1)
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
RMAN> restore database;
Starting restore at 22-AUG-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/orcl/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/orcl/example01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb0_07pghdqd_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb0_07pghdqd_1_1 tag=INDB0
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/orcl/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb0_06pghdqd_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb0_06pghdqd_1_1 tag=INDB0
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb0_05pghdqd_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb0_05pghdqd_1_1 tag=INDB0
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:46
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/datafile/test01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0bpghe88_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0bpghe88_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/orcl/hh01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0fpghqfm_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0fpghqfm_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 22-AUG-14
RMAN> recover database;
Starting recover at 22-AUG-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00005: /u01/app/oracle/oradata/orcl/example01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0bpghe88_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0bpghe88_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00001: /u01/app/oracle/oradata/orcl/system01.dbf
destination for restore of datafile 00004: /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_09pghe88_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_09pghe88_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00002: /u01/app/oracle/oradata/orcl/sysaux01.dbf
destination for restore of datafile 00003: /u01/app/oracle/oradata/orcl/undotbs01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0apghe88_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0apghe88_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00003: /u01/app/oracle/oradata/orcl/undotbs01.dbf
destination for restore of datafile 00005: /u01/app/oracle/oradata/orcl/example01.dbf
destination for restore of datafile 00006: /u01/app/datafile/test01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0gpghqfm_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0gpghqfm_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00001: /u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0epghqfm_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0epghqfm_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00002: /u01/app/oracle/oradata/orcl/sysaux01.dbf
destination for restore of datafile 00004: /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/backup/indb1_0fpghqfm_1_1
channel ORA_DISK_1: piece handle=/u01/app/backup/indb1_0fpghqfm_1_1 tag=INDB1
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
starting media recovery
archived log for thread 1 with sequence 11 is already on disk as file /u01/app/archivelog/dest1/1_11_856205535.dbf
archived log for thread 1 with sequence 13 is already on disk as file /u01/app/archivelog/dest1/1_13_856205535.dbf
archived log for thread 1 with sequence 14 is already on disk as file /u01/app/archivelog/dest1/1_14_856205535.dbf
archived log for thread 1 with sequence 15 is already on disk as file /u01/app/archivelog/dest1/1_15_856205535.dbf
archived log for thread 1 with sequence 16 is already on disk as file /u01/app/archivelog/dest1/1_16_856205535.dbf
archived log for thread 1 with sequence 17 is already on disk as file /u01/app/archivelog/dest1/1_17_856205535.dbf
archived log for thread 1 with sequence 18 is already on disk as file /u01/app/archivelog/dest1/1_18_856205535.dbf
archived log for thread 1 with sequence 19 is already on disk as file /u01/app/archivelog/dest1/1_19_856205535.dbf
archived log for thread 1 with sequence 20 is already on disk as file /u01/app/archivelog/dest1/1_20_856205535.dbf
archived log for thread 1 with sequence 21 is already on disk as file /u01/app/archivelog/dest1/1_21_856205535.dbf
archived log for thread 1 with sequence 22 is already on disk as file /u01/app/archivelog/dest1/1_22_856205535.dbf
archived log for thread 1 with sequence 23 is already on disk as file /u01/app/archivelog/dest1/1_23_856205535.dbf
archived log file name=/u01/app/archivelog/dest1/1_11_856205535.dbf thread=1 sequence=11
unable to find archived log
archived log thread=1 sequence=12
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/22/2014 22:15:46
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 12 and starting SCN of 835057
RMAN> recover database until scn 835057;
Starting recover at 22-AUG-14
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 22-AUG-14
SQL> alter database open resetlogs;
Database altered.
但记录在丢失的当前日志组中的记录已经丢失了:
SQL> select * from h2;
select * from h2
*
ERROR at line 1:
ORA-00942: table or view does not exist