oracle日志错误恢复

这2天碰到日志损坏的问题,在网上找了一下,觉得这个不错于是收录,供大家参考。


ORA-00320 cannot read file header from log string of thread string
  Cause The file is not available.
  Action Restore the log file.
  ORA-00320 无法从thread1的log1中读取文件头
  原因:文件已丢失
  解决方案:重新提取日志文件。
  ORA-00321 log string of thread string, cannot update log file header
  Cause Cannot write to the log file.
  Action Restore access to the file.
  ORA-00321: 无法更新日志的文件头
  原因:无法写入该日志文件
  解决方案:重新读取该日志文件
  ORA-00312 online log string thread string: 'string'
  Cause This message reports the file name for details of another message.
  Action Other messages will accompany this message. See the associated messages for the appropriate action to take.
  ORA-00312:联机日志错误
  原因:消息内容错乱,为其他消息的相关描述。
  解决方案:日志消息冲突。察看与相关动作匹配的消息。
  ORA-00313 open failed for members of log group string of thread string
  Cause The online log cannot be opened. The file may not be in the expected location.
  Action Specify the correct redo log file or make the log available, if necessary. Also, see the accompanying messages.
  ORA-00313: 日志组中数据文件丢失或出错
  原因:日志组中的日志文件无法被打开。
  解决方案:确保读取日志文件路径的正确性或重建日志文件。
  案例一:获取Oracle错误信息——数据库和网站崩溃
  错误描述:我使用的是Oracle 8.1.7.0.1,得到了如下的错误信息:
  ORA-00320 can not read file header from log 1 thread 1
  ORA-321 ORACLE_HOME Redo1.log
  ORA-27091: skgfqio: unable to queue I/O
  附加信息:我的操作系统是RedHat Linux ,我想知道如何进行修正才能让数据库和我们的网站再一次正常工作。
  解决方案:你的数据库缺少了一个现在redo日志。要纠正这个问题,按照以下的步骤在SQL*Plus 或者 SVRMGRL 中进行如下操作:
  1. CONNECT / AS SYSDBA
  2. STARTUP MOUNT
  3. RECOVER DATABASE UNTIL CANCEL;
  4. CANCEL (at first prompt)
  5. ALTER DATABASE OPEN RESETLOGS;
  当你用RESETLOGS启动数据库的时候,它会重新创建丢失的在线redo日志文件。此时,立即关闭数据库,并且进行良好的备份!如果你不这样做的话,你就不能恢复过去的resetlogs操作。
  案例二:日志损坏
  环境描述:linux 9 oracle9
  错误描述:今天不小心把名为redo01.log、redo02.log、redo03.log的三个文件请空了。
  结果数据库报错如下
  ORA-00320: cannot read file header from log 2 of thread 1
  ORA-00312: online log 2 thread 1: '/opt/app/oracle/oradata/actdb/redo02.log'
  ORA-27091: skgfqio: unable to queue I/O
  ORA-27069: skgfdisp: attempt to do I/O beyond the range of the file
  Additional information: 1
  Additional information: 1
  如何解决呢?
  解决方案:联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。
  损坏非当前联机日志:
  1、启动数据库,遇到ORA-00312 or ORA-00313错误,如:
  ORA-00313: open failed for members of log group 4 of thread 1
  ORA-00312: online log 3 thread 1: '/opt/oracle/db04/oradata/ORCL/redo03.log'
  从这里我们知道日志组1的数据文件损坏或丢失了
  从报警文件可以看到更详细的信息
  2、查看V$log视图:
  SQL> select group#,sequence#,archived,status from v$log;
  GROUP# SEQUENCE# ARC STATUS
  ---------- ---------- --- ----------------
  1 54 YES INACTIVE
  2 55 NO CURRENT
  3 53 YES INACTIVE
  可以知道,该组是非当前状态,而且已经归档。
  3、用CLEAR命令重建该日志文件
  SQL>alter database clear logfile group 3;
  如果是该日志组还没有归档,则需要用
  SQL>alter database clear unarchived logfile group 3;
  4、打开数据库,重新备份数据库
  SQL>alter database open;
  说明:
  1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就
  需要强行clear。
  2)、建议clear,特别是强行clear后作一次数据库的全备份。
  3)、此方法适用于归档与非归档数据库。
  损坏当前联机日志:
  归档模式下当前日志的损坏有两种情况,
  一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived
  logfile group n来重建。
  二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
  A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
  B. 通过强制性恢复,但是可能导致数据库不一致。
  下面分别用来说明这两种恢复方法
  1 通过备份来恢复
  1、打开数据库,会遇到一个类似的错误
  ORA-00313: open failed for members of log group 1 of thread 1
  ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
  ORA-27041: unable to open file
  OSD-04002: unable to open file
  O/S-Error: (OS 2) 系统找不到指定的文件
  2、查看V$log,发现是当前日志
  SQL> select group#,sequence#,archived,status from v$log;
  GROUP# SEQUENCE# ARCHIVED STATUS
  ---------- ---------- -------- ----------------
  1 1 NO CURRENT
  2 2
  YES INACTIVE
  3 3 YES INACTIVE
  3、发现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:\ORACLE\ORADATA\TEST\REDO01.LOG'
  4、拷贝有效的数据库的全备份,并不完全恢复数据库
  可以采用获取最近的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、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。
  如果没有备份,进行强制性恢复
  1、打开数据库,会遇到一个类似的错误
  ORA-00313: open failed for members of log group 1 of thread 1
  ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
  ORA-27041: unable to open file
  OSD-04002: unable to open file
  O/S-Error: (OS 2) 系统找不到指定的文件
  2、查看V$log,发现是当前日志
  SQL> select group#,sequence#,archived,status from v$log;
  GROUP# SEQUENCE# ARCHIVED STATUS
  ---------- ---------- -------- ----------------
  1 1 NO CURRENT
  2 2 YES INACTIVE
  3 3 YES INACTIVE
  3、发现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:\ORACLE\ORADATA\TEST\REDO01.LOG'
  4、把数据库down掉
  SQL>shutdown immediate
  5、在init.ora中加入如下参数
  _allow_resetlogs_corruption=TRUE
  6、重新启动数据库,利用until cancel恢复
  SQL>recover database until cancel;
  Cancel
  如果出错,不再理会,发出
  SQL>alter database open resetlogs;
  7、数据库被打开后,马上执行一个full export
  8、shutdown数据库,去掉_all_resetlogs_corrupt参数
  9、重建库
  10、import并完成恢复
  11、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
  说明:
  1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
  2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。
  3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析
  4、全部完成后做一次数据库的全备份
  5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。