Oracle 9.2.0.8.0 – ORA-600 – [17113]错误

某省级电信运营商核心生产库。
根据实例CRM1上的告警日志中记录,2011年12月1日08:37-08:43之间,出现了6次ORA-00600错误。

Thu Dec 1 08:37:52 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_1995124.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []
 Thu Dec 1 08:37:52 2011
 Trace dumping is performing id=[cdmp_20111201083752]
 Thu Dec 1 08:38:21 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_1995124.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []
 Thu Dec 1 08:39:47 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_2982400.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []
 Thu Dec 1 08:41:32 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_1995124.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []
 Thu Dec 1 08:42:13 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_1995124.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []
 Thu Dec 1 08:43:03 2011
 Thread 1 advanced to log sequence 197157
 Current log# 2 seq# 197157 mem# 0: /dev/rcrm_redo012lv
 Current log# 2 seq# 197157 mem# 1: /dev/rcrm_redo022lv
 Thu Dec 1 08:43:03 2011
 ARC1: Evaluating archive log 5 thread 1 sequence 197156
 ARC1: Beginning to archive log 5 thread 1 sequence 197156
 Creating archive destination LOG_ARCHIVE_DEST_1: '/arch01/1_197156.dbf'
 Thu Dec 1 08:43:37 2011
 Errors in file /oracle9/app/admin/crm/udump/crm1_ora_1995124.trc:
 ORA-00600: internal error code, arguments: [17113], [0x000000000], [], [], [], [], [], []

这个错误多为使用第三方工具(如PLSQL Developer,SQL Navigator)时出现的,尤其是工具的版本和RDBMS的版本有冲突时最可能出现。
根据错误中的提示,我们获取了跟踪文件/oracle9/app/admin/crm/udump/crm1_ora_1995124.trc,
从中可以发现,出现错误时,使用的客户端为PL/SQL Developer,其hash value与MOS上示例的值一致。

O/S info: user: Administrator, term: PC2011100510NLE, ospid: 2676:2564, machine: WORKGROUP\PC2011100510NLE
 program: plsqldev.exe
 application name: PL/SQL Developer, hash value=1190136663
 action name: Main session, hash value=1773317990

检查出现ORA-00600错误时的另一个跟踪日志/oracle9/app/admin/crm/udump/crm1_ora_2982400.trc,application name/action name记录的信息与另一个跟踪日志一致。

O/S info: user: Administrator, term: PC2011100510NLE, ospid: 3168:3188, machine: WORKGROUP\PC2011100510NLE
 program: plsqldev.exe
 application name: PL/SQL Developer, hash value=1190136663
 action name: Main session, hash value=1773317990

出现ORA-00600错误时,执行的SQL为:

Cursor 5 (110360558): CURBOUND  curiob: 11037fc78
curflg: 4c curpar: 0 curusr: 0 curses 700000c3b72b308
cursor name: 
declare
  t_owner varchar2(30);
  t_name  varchar2(30);
  procedure check_mview is
    dummy integer;
  begin
    if :object_type = 'TABLE' then
      select 1 into dummy
      from sys.all_objects
      where owner = :object_owner
      and object_name = :object_name
      and object_type = 'MATERIALIZED VIEW'
      and rownum = 1;
      :object_type := 'MATERIALIZED VIEW';
    end if;
  exception
    when others then null;
  end;
begin
  :sub_object := null;
  if :deep != 0 then
    begin
      if :part2 is null then
        select constraint_type, owner, constraint_name
          into :object_type, :object_owner, :object_name
          from sys.all_constraints c
         where c.constraint_name = :part1 and c.owner = user
           and rownum = 1;
      else
        select constraint_type, owner, constraint_name, :part3
          into :object_type, :object_owner, :object_name, :sub_object
          from sys.all_constraints c
         where c.constraint_name = :part2 and c.owner = :part1
           and rownum = 1;
      end if;
      if :object_type = 'P' then :object_type := 'PRIMARY KEY'; end if;
      if :object_type = 'U' then :object_type := 'UNIQUE KEY'; end if;
      if :object_type = 'R' then :object_type := 'FOREIGN KEY'; end if;
      if :object_type = 'C' then :object_type := 'CHECK CONSTRAINT'; end if;        
      return;
    exception
      when no_data_found then null;
    end;
  end if;
  :sub_object := :part2;
  if (:part2 is null) or (:part1 != user) then
    begin
      select object_type, user, :part1
      into :object_type, :object_owner, :object_name
      from sys.all_objects
      where owner = user
      and object_name = :part1
      and object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TYPE', 'TRIGGER', 'SYNONYM')
      and rownum = 1;
      if :object_type = 'SYNONYM' then
        select s.table_owner, s.table_name
          into t_owner, t_name
          from sys.all_synonyms s
         where s.synonym_name = :part1
           and s.owner = user
           and rownum = 1;
        select o.object_type, o.owner, o.object_name
          into :object_type, :object_owner, :object_name
          from sys.all_objects o 
         where o.owner = t_owner
           and o.object_name = t_name
           and object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TYPE', 'TRIGGER', 'SYNONYM')
           and rownum = 1;
      end if;
      :sub_object := :part2;
      if :part3 is not null then
        :sub_object := :sub_object || '.' || :part3;
      end if;
      check_mview;
      return;
    exception
      when no_data_found then null;
    end;
  end if;
  begin
    select s.table_owner, s.table_name
      into t_owner, t_name
      from sys.all_synonyms s
     where s.synonym_name = :part1
       and s.owner = 'PUBLIC'
       and rownum = 1;
    select o.object_type, o.owner, o.object_name
      into :object_type, :object_owner, :object_name
      from sys.all_objects o 
     where o.owner = t_owner
       and o.object_name = t_name
       and object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TYPE', 'TRIGGER', 'SYNONYM')
       and rownum = 1;
    check_mview;
    return;
  exception
    when no_data_found then null;
  end;
  :sub_object := :part3;
  begin
    select o.object_type, o.owner, o.object_name
      into :object_type, :object_owner, :object_name
      from sys.all_objects o
     where o.owner = :part1
       and o.object_name = :part2
       and object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TYPE', 'TRIGGER', 'SYNONYM')
       and rownum = 1;
    check_mview;
    return;
  exception
    when no_data_found then null;
  end;
  begin
    if :part2 is null and :part3 is null
    then
      select 'USER', null, :part1
      into :object_type, :object_owner, :object_name
      from sys.all_users u
      where u.username = :part1
      and rownum = 1;
      return;
    end if;
  exception
    when no_data_found then null;
  end;
  begin
    if :part2 is null and :part3 is null and :deep != 0
    then
      select 'ROLE', null, :part1
      into :object_type, :object_owner, :object_name
      from sys.session_roles r
      where r.role = :part1
      and rownum = 1;
      return;
    end if;
  exception
    when no_data_found then null;
  end;
  :object_owner := null;
  :object_type := null;
  :object_name := null;
  :sub_object := null;
end;

结论:

综合MOS和eygle博客上的信息,判断此为一个与PL/SQL Developer有关的Bug,建议客户选择合适版本的PL/SQL Developer进行操作。

参考:
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&doctype=REFERENCE&id=420844.1
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=154170.1
http://www.eygle.com/archives/2009/02/ora_07445_plsql_developer.html

普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress