_disable_logging 对于归档数据库的影响
2008-6-23
事件:为了测试硬盘IO是否是影响数据库性能的瓶颈,将数据库关闭redo log记录。设置_disable_logging=true。测试结束后,直接alter system set "_disable_logging"=false; alter system switch logfile; 后一直做不完,DB Hang。
分析:
检查alert log发现很多类似报错,主要如下:
Sat Jun 21 15:05:06 2008
ALTER SYSTEM SET _disable_logging=TRUE SCOPE=BOTH;
Sat Jun 21 15:06:04 2008
Thread 1 advanced to log sequence 132
Current log# 3 seq# 132 mem# 0: /ANTIDB_DS/redo/redo03.log
Current log# 3 seq# 132 mem# 1: /ANTIDB_D01/redo/redo03.log
Sat Jun 21 15:06:06 2008
ARC1: Log corruption near block 820285 change 7006681 time ?
Sat Jun 21 15:06:06 2008
Errors in file /oracle/admin/antidb1/bdump/antidb1_arc1_3672.trc:
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 820285 change 7006681 time 06/21/2008 14:38:31
ORA-00312: online log 2 thread 1: '/ANTIDB_D01/redo/redo02.log'
ORA-00312: online log 2 thread 1: '/ANTIDB_DS/redo/redo02.log'
ARC1: All Archive destinations made inactive due to error 354
Sat Jun 21 15:06:06 2008
ARC1: Closing local archive destination LOG_ARCHIVE_DEST_1: '/ANTIDB_ARCH/ANTIDB11_131_657212803.arc' (error 354)
(antidb1)
Committing creation of archivelog '/ANTIDB_ARCH/ANTIDB11_131_657212803.arc' (error 354)
Sat Jun 21 15:06:17 2008
ARC1: Failed to archive thread 1 sequence 131 (354)
ARCH: Archival stopped, error occurred. Will continue retrying
Sat Jun 21 15:06:17 2008
ORACLE Instance antidb1 - Archival Error
原因:
在归档数据库下,如果设置了 _disable_logging=true,那么数据库就会将所有的online redo logfile标记为corrput,从而在归档数据库下不能够正常的归档了,因此,每次需要当数据库中所有的日志组归档状态都为“NO”,且STATUS列的值出现n-1个“INACTIVE”和一个“CURRENT”时,即,除了当前日志外,其余所有的日志都是不活动且没有归档的时候,对数据库的所有操作(只要产生的日志超过current日志的可用大小的时候,也就是需要发生日志切换的时候)就会hang。
处理:
1、检查log 状态
Select * from v$log;
发现 3组日志的archive 状态都是no,难怪在日志切换的时候不能用。
2、 依次对所有没有归档的日志做清理未归档日志的工作
根据alert log的错误,依次对redo log 做清理
alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 3;
alter database clear unarchived logfile group 1;
需要清理哪些日志,你可以根据alert.log的报错来做,比如这里,当你清理了日志组2,alert中就开始报关于group 3不能归档的信息;当你清理了日志组3,alert中就开始报关于group 1不能归档的信息。。。,以此类推,所有的日志组都被初始化后,数据库就恢复正常了。
3、再次检查log 状态
Select * from v$log;
此时除了current组日志的archive 状态都是no,其他都是yes,状态为unused。这种状态在log 切换后就会变为正常。
4、进行数据库全备份
总结:对于隐含参数尽量不要修改,特别是在正式环境。
其他信息:
Select * from v$loghist; 查询redo log 切换历史
Select * from v$log;
Select * from v$logfile;