前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >故障分析:ORA-00001: unique constraint violated异常处理

故障分析:ORA-00001: unique constraint violated异常处理

作者头像
数据和云
发布2021-03-09 14:47:06
9.4K0
发布2021-03-09 14:47:06
举报
文章被收录于专栏:数据和云

墨墨导读:本文记录SYS.SCHEDULER$_INSTANCE_PK冲突异常分析及处理过程,希望对大家有帮助。

一、前言

最近,客户经常收到告警信息,一台数据库的安装目录/u01经常使用率经常达到96%以上。通过对该目录的空间使用情况进行分析发现,在$ORACLE_BASE数据库中短时间就会产生大量的trace文件和alert日志;所以造成空间不足;

二、问题分析过程及定位

通过对alert日志分析,发现数据库在运行期间出现了大量的主键冲突异常:

代码语言:javascript
复制
Fri Feb 19 11:23:27 2021
Errors in file /oracle/app/oracle/diag/rdbms/inas/inas2/trace/inas2_j003_29198.trc:
ORA-00001: unique constraint (.) violated
ORA-00001: unique constraint (SYS.SCHEDULER$_INSTANCE_PK) violated
代码语言:javascript
复制

通过相应的trc文件,可以发现,由于该主键冲突,所以导致job无法正常运行,从而产生大量的job错误的trace文件。

根据报错信息进行定位:

代码语言:javascript
复制
select INDEX_OWNER,INDEX_NAME,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION from dba_ind_columns where index_name='SCHEDULER$_INSTANCE_PK';

INDEX_OWNER                    INDEX_NAME                     TABLE_NAME                     COLUMN_NAME                    COLUMN_POSITION
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------
SYS                            SCHEDULER$_INSTANCE_PK         SCHEDULER$_EVENT_LOG           LOG_ID                                       1
SYS                            SCHEDULER$_INSTANCE_PK         SCHEDULER$_EVENT_LOG           DBID                                         2
代码语言:javascript
复制

可以发现该索引是一张系统表,该表的作用是用于记录SCHEDULER job执行情况的表的联合主键,是由log_id和dbid构成;

该主键发生冲突,则说明log_id的生成出现了重复;所以第一个想法就是该系统表中的内容是否可以清理;清理之后是否可以恢复正常。于是通过mos查了一下,这张表可以通过一些手段进行清理:

代码语言:javascript
复制
exec dbms_scheduler.purge_log();
truncate table sys.dbms_scheduler$event_log;
代码语言:javascript
复制

清理之后,发现alert日志还是报错,说明清理也无效; 此时,查询sys.dbms_scheduler$event_log表的数量,发现该表中只有1条,而通过对该表的两个主键列查询,发现这两个列的值为(-1,null)。 因此,怀疑问题处在log_id的生成上。

通过mos查询,发现当scheduler的log记录到log表里面,主要是通过一个序列:sys.scheduler_instance_s来生成的,但是sys.dbms_schedulerevent_log表中的log_id的大小被限制为4字节,当超限的时候,则会出现错误(参考mos上Doc ID 2057968.1)。

此时查询了下该序列:

代码语言:javascript
复制
select sys.scheduler$_instance_s.nextval from dual;
代码语言:javascript
复制

发现该序列确实超过了log_id限制的4字节大小。

因此,问题可以定位到是由于sys.scheduler$_instance_s序列生成的大小已经超过了log_id限制的大小范围,所以会出现无法记录的异常。

三、问题处理

处理方式即为将该序列进行重建,重新生成序列值,从而对log_id进行填充,具体重建方法如下(Doc ID 2057968.1给出的方式):

代码语言:javascript
复制
--修改参数,停止job
alter system set job_queue_processes=0 scope=memory;
--删除sequence
DROP SEQUENCE sys.scheduler$_instance_s;
--重建sequence
CREATE SEQUENCE sys.scheduler$_instance_s;
--执行recomp过程
EXECUTE UTL_RECOMP.RECOMP_SERIAL();
--修改参数,启动job
alter system set job_queue_processes=1000 scope=memory;
--设置执行窗口
exec dbms_scheduler.set_attribute('MONDAY_WINDOW','SYSTEM',TRUE);
--执行recomp过程
EXECUTE UTL_RECOMP.RECOMP_SERIAL();
代码语言:javascript
复制

重建之后,可以发现alert日志中不再出现异常错误,通过对sys.dbms_scheduler$event_log中的数值进行查看,可以发现log_id和dbid的值恢复正常增加的情况:

代码语言:javascript
复制
 select log_id,dbid from SCHEDULER$_EVENT_LOG where rownum < 10;

    LOG_ID       DBID
---------- ----------
       281
       282
       283
       284
       285
       286
       287
       288
       289

9 rows selected.
代码语言:javascript
复制

问题解决。

最后,提一句,通过mos中的案例,在11g升级到12c的时候也可能会出现该情况,导致升级有问题;而本次则是在11g数据库中正常使用的情况下出现了该问题,所以说明该问题在scheduler运行频繁的系统中也会有发生问题的可能性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、问题分析过程及定位
  • 三、问题处理
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档