前两天同事在测试DATA GUARD的时候将主库的ONLINE日志意外覆盖,造成数据库无法打开,采用隐含参数的方法打开又碰到ORA-600错误,最后采用设置EVENTS的方式解决。
由于是在别人的机器上操作,而且很多操作都是摸索进行,因此没有将操作记录下来。现在打算重现一下问题并简单记录解决过程。
上篇已经描述了问题的产生步骤,下面描述解决这个问题的方法。
ORA-600(2662)错误的重现和解决(一):http://yangtingkun.itpub.net/post/468/464682
产生问题的根源在于启动STANDBY数据库的时候,覆盖了PRIMARY数据库的在线LOGFILE。
尝试恢复数据库:
SQL> CONN /@YTK AS SYSDBA
已连接到空闲例程。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 167772388 bytes
Database Buffers 75497472 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> RECOVER DATABASE UNTIL CANCEL;
ORA-00279: 更改 5706539056 (在 12/11/2007 15:49:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\YTK\ARCHIVELOG\ARC01333_0577472831.001
ORA-00280: 更改 5706539056 (用于线程 1) 在序列 #1333 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1:
'E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSTEM_1TDY2CXS_.DBF'
ORA-01112: 未启动介质恢复
看来数据库已经无法通过正常方式启动了。这时候最好的办法是通过数据库的备份来进行恢复,通过不完全恢复来恢复数据库。
但是同事当时没有数据库的备份,那么就只能通过非常规的方式打开了。
由于丢失在线日志,所以只能通过添加隐含参数的方式:
SQL> ALTER SYSTEM SET "_allow_resetlogs_corruption" = TRUE SCOPE = SPFILE;
系统已更改。
SQL> SHUTDOWN IMMEDIATE
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 171966692 bytes
Database Buffers 71303168 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> RECOVER DATABASE UNTIL CANCEL
ORA-00279: 更改 5706539056 (在 12/11/2007 15:49:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\YTK\ARCHIVELOG\ARC01333_0577472831.001
ORA-00280: 更改 5706539056 (用于线程 1) 在序列 #1333 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1:
'E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSTEM_1TDY2CXS_.DBF'
ORA-01112: 未启动介质恢复
SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接
检查alert文件:
ALTER DATABASE MOUNT
Tue Dec 11 17:16:19 2007
Setting recovery target incarnation to 1
Tue Dec 11 17:16:19 2007
Successful mount of redo thread 1, with mount id 160883103
Tue Dec 11 17:16:19 2007
Database mounted in Exclusive Mode
Completed: ALTER DATABASE MOUNT
Tue Dec 11 17:16:46 2007
ALTER DATABASE RECOVER DATABASE UNTIL CANCEL
Tue Dec 11 17:16:46 2007
Media Recovery Start
parallel recovery started with 2 processes
ORA-279 signalled during: ALTER DATABASE RECOVER DATABASE UNTIL CANCEL ...
Tue Dec 11 17:16:49 2007
ALTER DATABASE RECOVER CANCEL
ORA-1547 signalled during: ALTER DATABASE RECOVER CANCEL ...
Tue Dec 11 17:16:51 2007
ALTER DATABASE RECOVER CANCEL
ORA-1112 signalled during: ALTER DATABASE RECOVER CANCEL ...
Tue Dec 11 17:17:00 2007
ALTER DATABASE OPEN RESETLOGS
Tue Dec 11 17:17:01 2007
RESETLOGS is being done without consistancy checks. This may result
in a corrupted database. The database should be recreated.
Tue Dec 11 17:17:01 2007
Errors in file e:\oracle\admin\ytk\udump\ytk_ora_2412.trc:
ORA-00265: 要求实例恢复, 无法设置 ARCHIVELOG 模式
Archive all online redo logfiles failed:265
RESETLOGS after incomplete recovery UNTIL CHANGE 5706539056
Resetting resetlogs activation ID 97264511 (0x5cc237f)
Online log E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG: Thread 1 Group 1 was previously cleared
Online log E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG: Thread 1 Group 2 was previously cleared
Online log E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO03.LOG: Thread 1 Group 3 was previously cleared
Tue Dec 11 17:17:01 2007
Setting recovery target incarnation to 2
Tue Dec 11 17:17:02 2007
Assigning activation ID 160883103 (0x996e19f)
LGWR: STARTING ARCH PROCESSES
ARC0 started with pid=18, OS id=2904
Tue Dec 11 17:17:02 2007
ARC0: Archival started
ARC1: Archival started
ARC1 started with pid=19, OS id=2584
Tue Dec 11 17:17:03 2007
LGWR: STARTING ARCH PROCESSES COMPLETE
LNS1 started with pid=20, OS id=3328
Tue Dec 11 17:17:06 2007
Thread 1 advanced to log sequence 2
Thread 1 opened at log sequence 2
Current log# 2 seq# 2 mem# 0: E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG
Successful open of redo thread 1
Tue Dec 11 17:17:06 2007
ARC1: Becoming the 'no FAL' ARCH
ARC1: Becoming the 'no SRL' ARCH
Tue Dec 11 17:17:06 2007
ARC0: Becoming the heartbeat ARCH
Tue Dec 11 17:17:06 2007
ARC1: LGWR is scheduled to archive destination LOG_ARCHIVE_DEST_2 after log switch
ARC1: Attempting destination LOG_ARCHIVE_DEST_2 network reconnect (270)
ARC1: Destination LOG_ARCHIVE_DEST_2 network reconnect abandoned
Tue Dec 11 17:17:07 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc1_2584.trc:
ORA-00270: 创建归档日志 时出错
ARC1: Error 270 Closing archive log file 'ytks'
Tue Dec 11 17:17:07 2007
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Tue Dec 11 17:17:07 2007
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Tue Dec 11 17:17:07 2007
SMON: enabling cache recovery
Tue Dec 11 17:17:08 2007
Errors in file e:\oracle\admin\ytk\udump\ytk_ora_2412.trc:
ORA-00600: 内部错误代码, 参数: [2662], [1], [1411571767], [1], [1411576360], [4194309], [], []
Tue Dec 11 17:17:11 2007
Errors in file e:\oracle\admin\ytk\udump\ytk_ora_2412.trc:
ORA-00600: 内部错误代码, 参数: [2662], [1], [1411571767], [1], [1411576360], [4194309], [], []
Tue Dec 11 17:17:11 2007
Error 600 happened during db open, shutting down database
USER: terminating instance due to error 600
Tue Dec 11 17:17:11 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_lns1_3328.trc:
ORA-00600: 内部错误代码, 参数: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:11 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_p001_1936.trc:
ORA-00600: 内部错误代码, 参数: [15784], [600], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:11 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_p000_576.trc:
ORA-00600: 内部错误代码, 参数: [15784], [600], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:11 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_pmon_3424.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:12 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_psp0_1720.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:12 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_mman_3256.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:12 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3528.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:12 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_ckpt_2696.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:12 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_dbw0_2148.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:14 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_reco_1928.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Tue Dec 11 17:17:14 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_smon_1940.trc:
ORA-00600: ??????, ??: [], [], [], [], [], [], [], []
Instance terminated by USER, pid = 2412
ORA-1092 signalled during: ALTER DATABASE OPEN RESETLOGS...
现在出现了前文提到的ORA-600[2662]错误。
查询metalink,Oracle给出了两种解决方法,如果600的2662错误中第三个参数和第五个参数差别很小,那么就可以通过多次打开关闭数据库实例的方式来增加SCN的值。
不过这种方式每次启动只SCN只增加1,重启三次系统:
ORA-00600: 内部错误代码, 参数: [2662], [1], [1411571770], [1], [1411576360], [4194309], [], []
而目前的SCN和期望的SCN还相差4000多,显然通过重启的方法不现实。
Oracle给出的第二种方式是通过设置EVENTS来提高Oracle的CURRENT SCN,这个方法的前提就是设置_allow_resetlogs_corruption隐含参数为true:
SQL> CONN /@YTK AS SYSDBA
已连接到空闲例程。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 209715428 bytes
Database Buffers 33554432 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> ALTER SESSION SET EVENTS '10015 TRACE NAME ADJUST_SCN LEVEL 1';
会话已更改。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
第 1 行出现错误:
ORA-00314: 日志 2 (用于线程 1) 要求的序号 2 与 0 不匹配
ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG'
数据库并没有打开,而是报错ORA-314。这个错误倒是很容易理解,由于目前的日志被STANDBY数据库的重置归档所覆盖,造成了这个期望的日志和当前的不满足。
下面将三个连接日志改名,使PRIMARY数据库找不到联机日志:
E:\>CD E:\ORACLE\ORADATA\YTK\ONLINELOG
E:\oracle\oradata\YTK\ONLINELOG>MOVE REDO01.LOG REDO01.LOG.BAK
E:\oracle\oradata\YTK\ONLINELOG>MOVE REDO02.LOG REDO02.LOG.BAK
E:\oracle\oradata\YTK\ONLINELOG>MOVE REDO03.LOG REDO03.LOG.BAK
再次尝试打开:
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
报错找不到文件,通过RESETLOGS方式创建新的日志:
SQL> RECOVER DATABASE UNTIL CANCEL
ORA-00279: 更改 5706539077 (在 12/12/2007 14:17:14 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\YTK\ARCHIVELOG\ARC00002_0641139429.001
ORA-00280: 更改 5706539077 (用于线程 1) 在序列 #2 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1:
'E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSTEM_1TDY2CXS_.DBF'
ORA-01112: 未启动介质恢复
SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接
再次尝试设置EVENTS:
SQL> CONN /@YTK AS SYSDBA
已连接到空闲例程。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 218104036 bytes
Database Buffers 25165824 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> ALTER SESSION SET EVENTS '10015 TRACE NAME ADJUST_SCN LEVEL 1';
会话已更改。
SQL> ALTER DATABASE OPEN;
ERROR:
ORA-03113: 通信通道的文件结束
错误和刚才已经有区别了,看来有打开的希望,检查alert文件发现:
ORA-00316: ?? 2 (???? 1) ?????? 0 ??????
ORA-00312: ???? 2 ?? 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG'
Wed Dec 12 14:45:55 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3712.trc:
ORA-00316: ?? 2 (???? 1) ?????? 0 ??????
ORA-00312: ???? 2 ?? 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOG'
Wed Dec 12 14:45:55 2007
LGWR: terminating instance due to error 316
Wed Dec 12 14:45:55 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_lns1_3508.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:55 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc1_536.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:55 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc1_536.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:55 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc1_536.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:55 2007
Master background archival failure: 316
Wed Dec 12 14:45:56 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc0_3656.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:56 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc0_3656.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:56 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_arc0_3656.trc:
ORA-00316: 日志 (用于线程 ) 头部中的类型 不是日志文件
Wed Dec 12 14:45:56 2007
Master background archival failure: 316
Wed Dec 12 14:45:56 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_dbw0_3716.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_pmon_3608.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_psp0_1816.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_mman_2304.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_reco_3408.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_ckpt_2296.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:58 2007
Errors in file e:\oracle\admin\ytk\bdump\ytk_smon_3416.trc:
ORA-00316: ?? (???? ) ?????? ??????
Wed Dec 12 14:45:59 2007
Instance terminated by LGWR, pid = 3712
报了一堆的ORA-316和ORA-312错误。为了避免现在仍然启动的STANDBY数据库干扰,关闭STANDBY数据库,再次尝试以RESETLOGS方式打开数据库:
SQL> CONN /@YTKS AS SYSDBA
已连接。
SQL> SHUTDOWN IMMEDIATE
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> CONN /@YTK AS SYSDBA
已连接到空闲例程。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 222298340 bytes
Database Buffers 20971520 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
SQL> RECOVER DATABASE UNTIL CANCEL
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
数据库终于打开。下面要做的就是去掉隐含参数,再次重启,验证是否可以启动。
SQL> ALTER SYSTEM RESET "_allow_resetlogs_corruption" SCOPE = SPFILE SID = '*';
系统已更改。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 218104036 bytes
Database Buffers 25165824 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
数据库已经打开。
数据库已经正常打开,但是由于使用_allow_resetlogs_corruption方式打开,会造成数据的丢失,且数据库的状态不一致。因此,这种情况下Oracle建议通过EXP方式导出数据库。重建新数据库后,再导入。