eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« Linux下硬盘格式化的相关命令Partprobe | Blog首页 | Toad 引发的ORA-00600 17281错误 »

Oracle数据库恢复:解决ORA-600 2831错误

一个数据库,不知怎样就陷入了ORA-600 2831 和 kcfofl_01错误中,表空间无法删除,频繁出现如下错误:
Sun Jun 27 20:27:36 2010
drop tablespace sdat
Sun Jun 27 20:27:36 2010
Errors in file d:\oracle\admin\eygle\udump\eygle_ora_4976.trc:
ORA-00600: 内部错误代码, 参数: [kcfofl_01], [0], [0x0], [0], [0], [], [], []

Sun Jun 27 20:27:38 2010
ORA-600 signalled during: drop tablespace sdat...
Sun Jun 27 20:27:38 2010
Errors in file d:\oracle\admin\eygle\udump\eygle_ora_4976.trc:
ORA-00600: 内部错误代码, 参数: [2831], [0], [0x0], [0x0], [1], [0], [], []
ORA-00600: 内部错误代码, 参数: [kcfofl_01], [0], [0x0], [0], [0], [], [], []
这个错误体现在表空间无法正常删除,那我们就尝试手工去清除文件及表空间信息:
SQL> delete from file$ where file#=10;

已删除1行。

SQL> select ts#,name from ts$;

       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 SYSAUX
         3 TEMP
         4 USERS
         5 UNDOTBS2
         6 DADI
         7 PERFSTAT
         8 SDAT

已选择9行。

SQL> delete from ts$ where ts#=8;
delete from ts$ where ts#=8
            *
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [2831], [0], [0x0], [0x0], [1], [0], [], []
在试图删除ts$记录时数据库出现错误,2831阻止了删除操作,数据库后台Crash时,检查alert文件,可以发现如下错误提示:
Sun Jun 27 20:32:59 2010
ORACLE Instance eygle (pid = 8) - Error 600 encountered while recovering transaction (8, 8).
Sun Jun 27 20:33:00 2010
Errors in file d:\oracle\admin\eygle\bdump\eygle_smon_1364.trc:
ORA-00600: internal error code, arguments: [2831], [0], [0x0], [0x0], [1], [0], [], []
注意到这里的提示,在回滚段8上存在一个需要恢复的事务,导致了异常,我不再管这个错误的具体含义,只是确认这个表空间可以清理掉,就开始向下进行,阻止这个事务的恢复,设置隐含参数:
*._corrupted_rollback_segments='_SYSSMU1$'
*._corrupted_rollback_segments='_SYSSMU2$'
*._corrupted_rollback_segments='_SYSSMU3$'
*._corrupted_rollback_segments='_SYSSMU4$'
*._corrupted_rollback_segments='_SYSSMU5$'
*._corrupted_rollback_segments='_SYSSMU6$'
*._corrupted_rollback_segments='_SYSSMU7$'
*._corrupted_rollback_segments='_SYSSMU8$'
*._corrupted_rollback_segments='_SYSSMU9$'
*._corrupted_rollback_segments='_SYSSMU10$'
*._offline_rollback_segments='_SYSSMU1$'      
*._offline_rollback_segments='_SYSSMU2$'      
*._offline_rollback_segments='_SYSSMU3$'      
*._offline_rollback_segments='_SYSSMU4$'      
*._offline_rollback_segments='_SYSSMU5$'      
*._offline_rollback_segments='_SYSSMU6$'      
*._offline_rollback_segments='_SYSSMU7$'      
*._offline_rollback_segments='_SYSSMU8$'      
*._offline_rollback_segments='_SYSSMU9$'      
*._offline_rollback_segments='_SYSSMU10$'
此时进行表空间的清理工作,是可以进行的:
SQL> delete from ts$ where ts#=8;

已删除 1 行。

SQL> rollback;

回退已完成。

SQL> select ts# from ts$;

       TS#
----------
         0
         1
         2
         3
         4
         5
         6
         7
         8

已选择9行。

SQL> select ts#,name from ts$;

       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 SYSAUX
         3 TEMP
         4 USERS
         5 UNDOTBS2
         6 DADI
         7 PERFSTAT
         8 SDAT

已选择9行。
尝试DROP表空间出错,数据库崩溃:
SQL> drop tablespace SDAT;
drop tablespace SDAT
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [kcfofl_01], [0], [0x0], [0], [0], [], [], []

SQL> alter tablespace SDAT online;
alter tablespace SDAT online
*
第 1 行出现错误:
ORA-00603: ORACLE 服务器会话因致命错误而终止
启动数据库再试试删除,又出错了:
SQL> delete from ts$ where ts#=8;
delete from ts$ where ts#=8
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [kcfofl_01], [0], [0x0], [1], [0], [], [], []
为什么呢?因为又有一个事务挂起了,需要恢复:
SQL> select name from v$rollname;

NAME
------------------------------
SYSTEM
_SYSSMU11$
_SYSSMU12$
_SYSSMU13$

再消灭这些回滚段后,可以再次执行删除操作:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 1719664640 bytes
Fixed Size                  1299604 bytes
Variable Size             377490284 bytes
Database Buffers         1333788672 bytes
Redo Buffers                7086080 bytes
数据库装载完毕。
数据库已经打开。

SQL> delete from ts$ where ts#=8;

已删除 1 行。

SQL> commit;

提交完成。

这之后还可能出UNDO的错误提示,将UNDO表空间重建可以消除:
Wed Jul 28 12:37:43 2010
Errors in file d:\oracle\admin\eygle\bdump\eygle_smon_2668.trc:
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kddummy_blkchk], [2], [121], [38508], [], [], [], []

Wed Jul 28 12:37:45 2010
Errors in file d:\oracle\admin\eygle\bdump\eygle_smon_2668.trc:
ORA-00600: internal error code, arguments: [kddummy_blkchk], [2], [121], [38508], [], [], [], []

再然后,表空间的维护工作可以顺利进行:
SQL> create tablespace test ;

表空间已创建。

SQL> drop tablespace test;

表空间已删除。

直接操作数据字典有风险,验证需要严谨!

-The End-


历史上的今天...
    >> 2011-07-28文章:
    >> 2008-07-28文章:
    >> 2007-07-28文章:
           遭遇Magpie多年前的一个Bug
    >> 2006-07-28文章:
           Windows Xp重新安装备忘
    >> 2005-07-28文章:
           瑞典游记-预告篇

无觅

By eygle on 2010-07-28 15:25 | Comments (0) | Backup&Recovery | Case | 2588 |


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com