ORA-00600: internal error code, arguments: [kwqitnmphe:ltbagi]

There are a lot ORA-00600 [kwqitnmphe:ltbagi] errors in alert log, this error is caused by a QMON slave background process:

*** 2019-10-05 18:43:28.563
*** SESSION ID:(1906.11789) 2019-10-05 18:43:28.563
*** CLIENT ID:() 2019-10-05 18:43:28.563
*** SERVICE NAME:(SYS$BACKGROUND) 2019-10-05 18:43:28.563
*** MODULE NAME:(Streams) 2019-10-05 18:43:28.563
*** ACTION NAME:(QMON Slave) 2019-10-05 18:43:28.563

kwqitmmit during kwqitmmit:time mgr IOT proc: Error 600 in Queue 
                                Table SYS.SYS$SERVICE_METRICS_TAB
kwqicaclcur: Error 600
Cursor Session Number : 1904
Cursor Session Serial : 24687
Cursor Pin Number : 24585
kwqitmmit during kwqitmmit:end proc: Error 600 in Queue Table 
                                        SYS.SYS$SERVICE_METRICS_TAB
kwqitptm: error 600 encountered during serving 10008981

*** 2019-10-05 18:43:28.564
ORA-00600: internal error code, arguments: [kwqitnmphe:ltbagi], 
                        [1], [0], [], [], [], [], [], [], [], [], []
OPIRIP: Uncaught error 447. Error stack:
ORA-00447: fatal error in background process
ORA-00600: internal error code, arguments: [kwqitnmphe:ltbagi], [1], 
                             [0], [], [], [], [], [], [], [], [], []

CAUSES

There are still historical messages without a current Subscriber (a.k.a. orphaned entries in the IOT history table).

SQL> select count(*) from AQ$_SYS$SERVICE_METRICS_TAB_H;

COUNT(*)
----------
6268766

SQL> select sub_hist.NAME, sub_hist.SUBSCRIBER#, sub_hist.MSGID, 
            msg.QUEUE, msg.MSG_STATE
       from
            AQ$_SYS$SERVICE_METRICS_TAB_H sub_hist,
            AQ$SYS$SERVICE_METRICS_TAB msg
       where
            sub_hist.MSGID = msg.MSG_ID and
            NOT EXISTS (select sub.SUBSCRIBER_ID 
                         from aq$_SYS$SERVICE_METRICS_TAB_s sub 
                     where sub_hist.subscriber# = sub.SUBSCRIBER_ID);

no rows selected

WORKAROUND

1)Purge all the messages in queue table SYS$SERVICE_METRICS_TAB.

DECLARE
     po dbms_aqadm.aq$_purge_options_t;
BEGIN
     po.block := FALSE;
     DBMS_AQADM.PURGE_QUEUE_TABLE(
            queue_table => 'SYS.SYS$SERVICE_METRICS_TAB',
            purge_condition => NULL,
            purge_options => po);
END;
/

2)Recompile any invalid objects including possible queue and rule sets.

SQL> select owner, object_name, object_type 
       from dba_objects 
      where owner='SYS' and status!='VALID';

OWNER         OBJECT_NAME            OBJECT_TYPE
------------  -------------------   --------------
SYS          SYS$SERVICE_METRICS_N    RULE SET
@?/rdbms/admin/utlrp.sql
SQL> select owner, object_name, object_type 
       from dba_objects 
      where owner='SYS' and status!='VALID';

no rows selected

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.