暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORA-00600: 内部错误代码, 参数: [4194]或[4193]

原创 逆风飞翔 2022-10-23
1422

4193:表示undo和redo不一致(Arg [a] Undo record seq number,Arg [b] Redo record seq number );
4194:表示undo和redo不一致(Arg [a] Maximum Undo record number in Undo block,Arg [b] Undo record number from Redo block)

该错误是由重做记录与回滚记录不匹配引发。Oracle在验证Undo record number时,会对比redo change 和回滚段中的undo record number,若发现2者存在差异则报该4194错误。其错误argument[a][b],a代表回滚块中的最大undo record number,b代表重做日志中记录的undo record number。
这个问题通常发生在掉电或硬件故障导致数据库crash,在启动时,数据库执行正常的前滚(重做),然后回滚(撤销),这就是回滚时产生错误的地方。

当然还有很多其他的原因导致ORA-00600 [4194] 错误,比如说smon执行事务恢复,回滚段冲突或者损坏,oracle bug等。

ORA-00600: 内部错误代码, 参数: [4194]或[4193]
数据库版本:
Oracle 11.2.0.1.0

问题现象:
alter database open resetlogs; 时报错如下
ORA-1092 signalled during: ALTER DATABASE OPEN...
Doing block recovery for file 3 block 261754
No block recovery was needed
Errors in file e:\app\administrator\diag\rdbms\klnew\klnew\trace\ klnew_ora_2072.trc (incident=92624):
ORA-00600: 内部错误代码, 参数: [4194] , [], [], [], [], [], [], [], [], [], [], []
ORA-01092: ORACLE 实例终止。强制断开连接
ORA-00600: 内部错误代码, 参数: [4194] , [], [], [], [], [], [], [], [], [], [], []
Incident details in: e:\app\administrator\diag\rdbms\klnew\klnew\incident\incdir_92624\ klnew_ora_2072_i92624.trc
Doing block recovery for file 3 block 261754
No block recovery was needed

No Resource Manager plan active
Errors in file e:\app\administrator\diag\rdbms\klnew\klnew\trace\klnew_smon_3776.trc (incident=87732):
ORA-00600: internal error code, arguments: [4193] , [], [], [], [], [], [], [], [], [], [], []
Incident details in: e:\app\administrator\diag\rdbms\klnew\klnew\incident\incdir_87732\klnew_smon_3776_i87732.trc
Exception [type: ACCESS_VIOLATION, UNABLE_TO_READ] [ADDR:0x66288933] [PC:0x9237D88, kgegpa()+38]
Dump file e:\app\administrator\diag\rdbms\klnew\klnew\trace\alert_klnew.log
解决方案1.:
(1)启动数据库到nomount,创建pfile,修改参数
(2)修改pfile,添加如下参数
undo_management = manual
--or---
undo_management由原来的 auto 改成 manual
event = '10513 trace name context forever, level 2'

(3)关闭数据库,restrict模式启动
SYS@chnldev> shutdown immediate


SYS@chnldev> startup restrict

(4)查询online的回滚段
SYS@chnldev> select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE';

TABLESPACE_NAME STATUS SEGMENT_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
这里十分重要,我们这里所有的回滚段都是offlien状态(system回滚段是永久online的)。
如果有online的非system回滚段,那么处理过程会更加复杂。

(5)重建undo表空间,并保留现有undo_tablespace参数
SYS@chnldev> create undo tablespace new_undotbs datafile '/data/orauser01/app/oradata/orcl/new_undotbs01.dbf' size 2000M;

Tablespace created.

SYS@chnldev> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string MANUAL
undo_retention integer 900
undo_tablespace string UNDOTBS1

(6)修改undo_tablespace参数,并重启数据库
修改pfile,将undo_tablespace参数修改为new_undotbs,然后重启数据库

SYS@chnldev> shutdown immediate;

SYS@chnldev> startup

解决方案2.:
解决问题时间充足时,可以通过 trace 日志找到损坏的回滚段,通过隐含参数屏蔽损坏的回滚段;

需要尽快解决问题时,可以直接通过隐含参数屏蔽所有的回滚段,之后启动数据库,创建新的 UNDO 表空间;

设置 undo_management由原来的 auto 改成 manual(undo_tablespace= SYSTEM) ,后可以启动数据库,
但是执行 Expdp 或应用进行前台操作时,会报错: ORA-01552:

cannot use system rollback segment for non-system tablespace 'TEMP';
ORA-01552: cannot use system rollback segment for non-system tablespace 'NNC_DATA01';
1:查看正在使用的回滚段
select segment_name, tablespace_name, status from dba_rollback_segs ;--where status != 'OFFLIINE;

2: 使用 _corrupted_rollback_segments 参数可以使数据库在启动的时候 , 忽略损坏的回滚段 , 使数据库正常启动 .

*._corrupted_rollback_segments=( _SYSSMU1_3086899707$,_SYSSMU2_1531987058$,_SYSSMU3_478608968$,_SYSSMU4_1451910634$,_SYSSMU5_2520346804$,_SYSSMU6_1439239625$,_SYSSMU7_1101470402$,_SYSSMU8_1682283174$,_SYSSMU9_3186340089$,_SYSSMU10_378818850$ )

另外 : _offline_rollback_segments 参数可以让指定的回滚段处于 OFFLINE 状态

3: undo_management改回 auto ;

此时启动数据库会自动创建另一个回滚段,其他的 10 个回滚段会自动 offline;

4:创建新的 UNDO 表空间
重建undo表空间,并保留现有undo_tablespace参数

create tablespace undotbs2 datafile 'D:\APP_10.2.0.4\CJC_DATAFILE\UNDOTBS02.DBF' size 10M autoextend on;
alter system set undo_tablespace=UNDOTBS2 scope=spfile;

5: Drop tablespace UNDOTBS1 including contents and datafiles

1)数据库开启的情况下,重建 undotbs,然后重新指定到新undotbs上。
2)未打开情况下,修改 undo_management 参数为 manua l或者(也有说并且的)提供新的回滚段。

解决方法3:
由于不适合对单个回滚段进行offline或者drop,而且数据库现在还可以正常打开,于是通过下面的方法重建undo表空间:
1.创建新的undo表空间
create tablespace undotbs2 datafile'/data/数据库名称/undotbs2.dbf' size30g
2.切换UNDO表空间为新的UNDO表空间
alter system set undo_tablespace=undotbs2;
3.删除原来的undo表空间
drop tablespace undotbs1 including contents;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论