您的位置:首页 > 数据库 > Oracle

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

2013-05-16 12:33 477 查看
SQL>startup 之后报错

ORA-00314:log 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)
.

在数据库mount或open状态下查询 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 log是inactive, 說明該組日志是非當前日志, 而且已經歸檔完成 (
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 log是current , 說明該組日志是當前日志. (
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<sid>;.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、建议成功后严格执行以上的7到11步,完成数据库的检查与分析 

4、全部完成后做一次数据库的全备份 

5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: