丢失活动或当前日志组的恢复

我们知道current状态的日志组是oracle正在使用的日志组,也就是LGWR在写的日志组,如果这种状态的日志组丢失了,那么我们如何来恢复呢?
这里要分成两种情况,一种是数据库正常关闭,一种是数据库异常关闭。
如果数据库是正常关闭的,由于此时数据库已经完成了检查点,所有提交的事务都已经被写入到数据文件中,所以不存在数据丢失,当前日志在实例恢复中不再需要,那么我们可以直接使用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

在hh用户下创建表h2,并且在其中插入1000000条记录:
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.

接着,把current的日志组3---redo03.log移到其他目录:
[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

下面我们启动数据库到mount,查看各日志组的状态:
SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          1 ACTIVE
         3          1 ACTIVE
         2          1 CURRENT

尝试使用clear命令:
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进行还原恢复:
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

使用resetlogs打开数据库:
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




请使用浏览器的分享功能分享到微信等