首页 > 数据库 > Oracle > 丢失redo的solution
今早打开自己的测试库发现alter system switch logfile无法日志交换,具体问题及解决步骤如下:
C:Documents and Settings0990753>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 20 10:19:34 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> alter system switch logfile;
总是等待,看来日志交换出了问题,查看v$session_wait有event switch logfile command事件,又查看alertxiaoyu.log发现如下信息
ARC0: All Archive destinations made inactive due to error 354
Deleted Oracle managed file D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAXIAOYUARCHIVELOG2011_12_20O1_MF_1_12_7GZWCG09_.ARC
ARC0: Failed to archive thread 1 sequence 12 (354)
ARCH: Archival stopped, error occurred. Will continue retrying
Tue Dec 20 10:22:38 2011
Errors in file d:oracleproduct10.2.0adminxiaoyubdumpxiaoyu_arc0_564.trc:
ORA-16038: log 3 sequence# 12 cannot be archived
ORA-00354: corrupt redo log block header
ORA-00312: online log 3 thread 1: 'D:ORACLEPRODUCT10.2.0ORADATAXIAOYUREDO03.LOG'
Tue Dec 20 10:22:42 2011
ARC1: Archiving not possible: No primary destinations
ARC1: Failed to archive thread 1 sequence 12 (4)
ARCH: Archival stopped, error occurred. Will continue retrying
Tue Dec 20 10:22:43 2011
Errors in file d:oracleproduct10.2.0adminxiaoyubdumpxiaoyu_arc1_560.trc:
ORA-16014: log 3 sequence# 12 not archived, no available destinations
ORA-00312: online log 3 thread 1: 'D:ORACLEPRODUCT10.2.0ORADATAXIAOYUREDO03.LOG'
Tue Dec 20 10:22:44 2011
ARC0: Archiving not possible: No primary destinations
Tue Dec 20 10:22:44 2011
ARC1: Archiving not possible: No primary destinations
有个ORA-00354: corrupt redo log block header日志文件块头有错误,ORA-00312: online log 3 thread 1: 'D:ORACLEPRODUCT10.2.0ORADATAXIAOYUREDO03.LOG'日志文件有问题,然后又是ORA-16038: log 3 sequence# 12 cannot be archived,
查看日志归档情况
SQL> select group#,archived,status from v$log;
GROUP# ARCHIVED STATUS
---------- -------- ----------------
1 NO INACTIVE
2 NO CURRENT
3 NO INACTIVE
初步分析应该是redo03日志块头有问题导致redo03一直没有归档成功,由于当前的current是redo02,alter system switch logfile后current会到redo03,此时redo03又没有被归档不能被覆盖所以一直会出现switch logfile command等待。
清空redo03看看是否能日志交换成功
SQL> alter database clear unarchived logfile group 3;
数据库已更改。
SQL> alter system switch logfile;
系统已更改。
看来问题解决了,由于redo02没有归档就清空覆盖了,archivelog已经出现了不连续性,建议马上做个数据库的全备,不然介质恢复时无法跨越这个点而进行恢复。
由于数据库是打开的,不过如果数据库在open时出现redo错误,这里又分为
1 非活动redo
此时checkpoint已经完成了,可以直接
SQL> alter database clear unarchived logfile group 3;
数据库已更改。
Sql>alter database open;
2 current redo或者active redo
如果数据库正常关闭,checkpoint已经完成,即使丢失了活动redo,数据库也可以打开。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 373293056 bytes
Fixed Size 1249080 bytes
Variable Size 130023624 bytes
Database Buffers 239075328 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'D:ORACLEPRODUCT10.2.0ORADATAXIAOYUREDO01.LOG'
此时在os上删除了所有的redo
SQL> alter database clear logfile group 1;
数据库已更改。
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> alter database clear unarchived logfile group 3;
alter database clear unarchived logfile group 3
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 3 (用于线程 1) 的成员
ORA-00312: 联机日志 3 线程 1:
'D:ORACLEPRODUCT10.2.0ORADATAXIAOYUREDO03.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
无法clear需要进行介质恢复
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
如果数据库异常关闭,checkpoint没有进行,又丢失了活动redo,,因为没有完成checkpoint,数据文件和控制文件已经不一致,而不一致是无法打开数据库的根本原因
此时就需要进行数据库恢复,可以采取不完全恢复,从备份中restore数据文件然后利用最后的一致的archivelog进行不完全恢复,不过由于丢失了活动的redo,会丢失这部分数据.
还可以利用oracle的隐含参数_allow_resetlogs_corruption为true而忽略跳过oracle到open阶段的一致性检查,然后强制recover database until cancel,选择cancel出现错误忽略,最后resetlogs打开数据库,运气好可以顺利open(此时数据库可能已经损坏,建议exp备份 imp重建数据库),不然此时强制open可能会出现一系列的ora-00600等错误,就需要进一步采取恢复了,所以在利用隐含参数时最好做db的冷备份,可以保留现场.
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1056892/ ,如需转载,请注明出处,否则将追究法律责任。