ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle online redo log日志 (当前或非当前日志) 损坏之后的DB恢复

Oracle online redo log日志 (当前或非当前日志) 损坏之后的DB恢复

原创 Linux操作系统 作者:tolywang 时间:2007-10-16 00:00:00 0 删除 编辑

SQL>startup 之后报错

ORA-00314log 3 of thread 1 , expected sequence# doesn't match
ORA-00312:
online log 3 thread 1 :'/home/oracle/app/oracle/oradata/ora8/redo01.log'

联机日志分为当前联机日志(current)和非当前联机日志(inactive),非当前联机日志(inactive)的损坏是比较简单的,一般通过clear命令就可以解决问题。


如何查询online redo log的状态(是否current 还是inactive) .

在数据库mountopen状态下查询 v$log 即可看到。

例如:

SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIV STATUS

---------- ---------- ------ --------------------------------

1 67 YES INACTIVE

2 68 YES INACTIVE

3 69 NO CURRENT

下面分;兩種情況分析:

1. 如果查询v$log發現損壞的online redo loginactive, 說明該組日志是非當前日志, 而且已經歸檔完成 ( STATUS INACTIVE , ARCHIVE YES ) .

處理方法(適用於歸檔及非歸檔數據庫) :

使用clear 命令清理這個文件所在的redo log group .

SQL> alter database clear logfile group 3 ;

如果該日志組還沒有歸檔 (STATUS INACTIVE , ARCHIVE NO )

那麼需要使用如下命令

SQL> alter database clear unarchived logfile group 3 ;

然後打開數據庫 , 備份 .

2. 如果查询v$log發現損壞的online redo logcurrent , 說明該組日志是當前日志. ( STATUS current , ARCHIVE NO ) .

当前日志损坏分为两种情况:

第一种是日志中没有未决的事务需要实例恢复(所有事务都已经提交或回滚完成),那么当前日志组的损坏可以直接用 alter database clear unarchived logfile group n ; 来重新建立。

第二种是日志组中出现问题的时候有活动(Active)的事务. 数据库需要媒体恢复(Media Recovery), 日志组需要应用来同步数据,有两种补救方法:

A. 最好的方法是不完全恢复,可以保证数据的一致性,但是这种办法要求在归档方式下,并且有可用的备份。

B. 通过强制性恢复,不过这种方法可能导致数据不一致。

方法A: 通过可用备份实行不完全恢复。

可能看到的问题点是,打开数据库的时候

ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2)
系统找不到指定的文件

查看 v$log 发现是当前日志

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS

1 1 31 104857600 1 NO CURRENT

2 1 29 104857600 1 YES INACTIVE

3 1 30 104857600 1 YES INACTIVE

试图clear, 但是不成功
SQL>; alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

拷贝有效的数据库的全备份,并不完全恢复数据库 可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。 如:
SQL>; recover
database until cancel;
Auto
……
SQL>; recover
database until cancel;
Cancel;
5
、利用alter database open resetlogs 打开数据库 说明:
1
、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据
2
、这种方法适合于归档数据库并且有可用的数据库全备份。 3、恢复成功之后,记得再做一次数据库的全备份。
4
、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

方法B: 通过强制恢复,可能导致数据不一致。

可能看到的问题点是,打开数据库的时候

ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2)
系统找不到指定的文件

查看 v$log 发现是当前日志

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS

1 1 31 104857600 1 NO CURRENT

2 1 29 104857600 1 YES INACTIVE

3 1 30 104857600 1 YES INACTIVE

试图clear, 但是不成功
SQL>; alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

把数据库down
SQL>;shutdown immediate
init;.ora中加入如下参数 _allow_resetlogs_corruption=TRUE 重新启动数据库,利用until cancel恢复
SQL>;recover database until cancel;
Cancel
如果出错,不再理会,发出
SQL>;alter database open resetlogs;
数据库被打开后,马上执行一个full export
shutdown
数据库,去掉_all_resetlogs_corrupt参数 重建库
import
并完成恢复 建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;

说明:
1
、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
2
、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。 3、建议成功后严格执行以上的711步,完成数据库的检查与分析
4
、全部完成后做一次数据库的全备份
5
、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84951/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13403863