rman恢复--丢失联机重做日志的恢复

时间:2022-04-13 08:09:50

原文地址:http://blog.itpub.net/28698327/viewspace-1065460/

联机重做日志大致分为两种状态:当前正在写的和当前没有写的,丢失不同状态的联机重做日志文件,其处理方式也是不一样的,下面分别介绍。



联机重做日志文件须知
查看当前数据库中联机重做日志文件的状态
SQL> select group#,thread#,sequence#,members,archived,status from v$log;

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
     1         1            1       1 NO     CURRENT
     2         1            0       1 YES UNUSED
     3         1            0       1 YES UNUSED


注意视图中的status列,该列标示着联机重做日志的状态,共有6中可选值
UNUSED  ---标示从未用过。一般刚刚创建或open resetlogs打开后,联机重做日志组为这一状态。
CURRENT  ---表示当前的。
ACTIVE     ---表示活动的。虽然不是当前状态,但也有可能正被使用或要被使用,比如crash recovery时可能存在这中联机重做日志组
CLEARING  ---日志正在清空,当执行 alter database clear logfile语句时,该日志组状态为这种状态,语句执行完毕后,操作的日志组状态变为UNUSED.
INACTIVE  ---不活动状态。表示改组日志中的内容已经被归档或顺利写入数据文件,该组日志可被继续重用。
CLEARING_CURRENT ---日志正在清空,但是由于清空出错,如I/O设备无法访问,导致清空工作不能顺利完成。


由上述视图可见,group 1 的联机重做日志组位当前状态,然后在查询v$logfile视图,即可看到联机重做日志组对应的文件

SQL> select group#,member from v$logfile;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
     1
/u01/app/oracle/oradata/orcl/redo01.log

     2
/u01/app/oracle/oradata/orcl/redo02.log

     3
/u01/app/oracle/oradata/orcl/redo03.log


SQL> 


group 1 对应的是/u01/app/oracle/oradata/orcl/redo01.log,就是当前的联机重做日志文件。

丢失非当前的联机重做日志文件

1:模拟文件丢失
步骤:先shutdown ,在delete日志文件,在startup
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


[oracle@oracle ~]$ cd /u01/app/oracle/oradata/orcl/
[oracle@oracle orcl]$ ll
total 2008060
-rw-r----- 1 oracle oinstall   9748480 Dec 24 22:34 control01.ctl
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:34 orcl_data.dbf
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:34 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:07 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:07 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Dec 24 22:34 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Dec 24 22:34 system01.dbf
-rw-r----- 1 oracle oinstall  72359936 Dec 24 22:09 temp01.dbf
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:34 test_data.dbf
-rw-r----- 1 oracle oinstall 387981312 Dec 24 22:34 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Dec 24 22:34 users01.dbf

[oracle@oracle orcl]$ rm redo02.log


 SQL> startup ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
ORA-03113: 通信通道的文件结尾
进程 ID: 6762
会话 ID: 1 序列号: 5

2:恢复丢失的联机重做日志文件
这里group 2 对应的联机重做日志文件丢失,可以通过 alter database clear logfile 命令重建日志即可,如下
SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
ORA-03113: 通信通道的文件结尾
进程 ID: 6762
会话 ID: 1 序列号: 5


SQL> conn /as sysdba

Connected to an idle instance.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.

SQL> alter database clear logfile group 2;

Database altered.

SQL> alter database open;

Database altered.

数据库就可以正常打开了。
由上所述,对于非当前的联机重做日志文件损坏,其修复过程非常简单,并且操作安全,不会造成数据丢失。

丢失当前的联机重做日志文件
1:模拟文件丢失
手动删除联机重做日志文件,如果确认是否为当前重做日志文件可以根据上面操作。
注意:数据库打开状态时,丢失当前的联机重做日志文件会造成数据库崩溃,也就是数据库处于不一致的状态,为了尽可能的贴近实际,这才在关闭数据库时,采用了shutdown abort 方式关闭。

操作:先shutdown abort,在delete文件,在startup
SQL> shutdown abort;
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.

oracle@oracle orcl]$ rm redo01.log
[oracle@oracle orcl]$ ll
total 1956856
-rw-r----- 1 oracle oinstall   9748480 Dec 24 23:49 control01.ctl
-rw-r----- 1 oracle oinstall  52436992 Dec 24 23:39 orcl_data.dbf
-rw-r----- 1 oracle oinstall  52429312 Dec 24 23:39 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 23:39 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Dec 24 23:45 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Dec 24 23:44 system01.dbf
-rw-r----- 1 oracle oinstall  72359936 Dec 24 23:28 temp01.dbf
-rw-r----- 1 oracle oinstall  52436992 Dec 24 23:39 test_data.dbf
-rw-r----- 1 oracle oinstall 387981312 Dec 24 23:44 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Dec 24 23:39 users01.dbf

启动数据库
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: '/u01/app/oracle/oradata/orcl/redo01.log'
ORA-27037: 无法获得文件状态
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


修复联机重做日志文件
1:尝试通过 alter database clear logfile 命令修复丢失的重做日志文件
SQL> alter database clear logfile group 1;              
alter database clear logfile group 1
*
ERROR at line 1:
ORA-01624: 日志 1 是紧急恢复实例 orcl (线程 1) 所必需的
ORA-00312: 联机日志 1 线程 1: '/u01/app/oracle/oradata/orcl/redo01.log'

根据错误信息可知,丢失的重做日志文件中包含必备的重做信息,无法被clear。
2:执行不完全恢复
如果是归档模式下,并且有备份,建议通过备份进行不完全恢复,正常情况下只丢失当前的重做日志文件中的数据。
recover database until cancel;
如果没有备份,就只能强制恢复了。这里我们需要修改一个隐藏的初始化参数:
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

SQL> shutdown immediate;
ORA-01109: 数据库未打开


Database dismounted.
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
SQL> recover database until cancel;
ORA-00279: 更改 840952 (在 12/25/2013 00:20:34 生成) 对于线程 1 是必需的
ORA-00289: 建议:
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_12_25/o1_mf_1_1_%u_.arc
ORA-00280: 更改 840952 (用于线程 1) 在序列 #1 中


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

cancel

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'


ORA-01112: 未启动介质恢复


SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open resetlogs;

Database altered.

SQL> conn test/test
Connected.

SQL> select * from t1;

     ID NAME
---------- --------------------
     1 sun
     1 sun
     1 sun
     1 sun

SQL> 



那么我之前添加的数据(没有切换归档),不管是提交的还是未提交的数据,都会丢失。


注意:强烈建议,当数据库恢复成功以后,应该马上进行备份(expdp或exp)等备份方式,备份数据库,然后新建数据库,再通过imp或ipmdp方式将之前导出的二进制备份文件导入到新库。

强制恢复完成以后,测试下数据库,
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
Database opened.
SQL> 

如果没有问题,那么说明ok了。