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

盖国强 2019-05-08
13
0 0
摘要:一个数据库,不知怎样就陷入了ORA-600 2831 和 kcfofl_01错误中,表空间无法删除,频繁出现错误

问题描述

一个数据库,不知怎样就陷入了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;

表空间已删除。

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

「喜欢文章,快来给作者赞赏墨值吧」

评论

0
0
Oracle
订阅
欢迎订阅Oracle频道,订阅之后可以获取最新资讯和更新通知。
墨值排行
今日本周综合
近期活动
全部
相关课程
全部