联系:手机/微信(+86 17813235971) QQ(107644445)
标题:ORA-600 12807(CON$.CON#达到最大值) 处理
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
这次阳了有点严重,客户现场打patch无法去,在家里远程值守,在电脑前面闲着就查询和重现了最近朋友和我说的他们的客户遇到ORA-600 12807的故障.查询了下mos,基本上可以确认是由于CON$.CON#达到理论最大值无法继续增加从而报该错误,参考文档:
Mechanism to Recycle Database Constraint Identifiers (Doc ID 2925056.1)
Bug 13781691 – ORA-600 [12807] if CON$.CON# very high due to bug 13784384 (Doc ID 13781691.8)
Bug 25343563 – Mechanism to Implement Constraint Identifier (con#) Recycling (Doc ID 25343563.8)
在12及其之后的版本中oracle发布了patch 25343563 并设置event启用该patch进行解决.但是如果是12c之前版本,官方没有提供直接的解决方案.最基本的解决方法就是进行数据逻辑迁移,以及避免频繁创建约束导致con$.con#消耗太大
通过试验重现该错误
SQL> create table t_xff (id number not null,name varchar2(100) not null); create table t_xff (id number not null,name varchar2(100) not null) * ERROR at line 1: ORA-00600: internal error code, arguments: [12807], [], [], [], [], [], [], [], [], [], [], [] SQL> create table t_xff (id number,name varchar2(100)); Table created. SQL> alter table t_xff add primary key(id); alter table t_xff add primary key(id) * ERROR at line 1: ORA-00600: internal error code, arguments: [12807], [], [], [], [], [], [], [], [], [], [], [] SQL> select con# from sys.con$ where name='_NEXT_CONSTRAINT'; CON# ---------- 4294967294
通过一些底层分析,并对部分底层基表进行patch实现数据库可以继续创建约束
SQL> alter table t_xff add primary key(id); Table altered.
使用临时的patch方法,可以快速的恢复业务,后续找适当时间点安排迁移.
在此提醒:对于一些创建中间对象或者临时对象频繁的系统(特别是大量主键,not null等)注意检查该值距离天花板距离,如果比较接近了最好安排一次逻辑迁移和找出来原因(是oracle bug还是应用触发)