DBMS_STATS Fails ORA-06512 and ORA-20001

来源:这里教程网 时间:2026-03-03 21:50:42 作者:

问题现象: 收集统计信息时报错ORA-06512 and ORA-20001

ERROR at line 1:
ORA-20001: subscribe_AQ_agent: ST$T15401 - -24067: ORA-24067: exceeded maximum number of subscribers for queue SYS.SCHEDULER$_EVENT_QUEUE
ORA-06512: at "SYS.DBMS_STATS", line 24281
ORA-06512: at "SYS.DBMS_STATS", line 24332

报错队列满了
找到队列对应的队列表
SQL> select OWNER,NAME,QUEUE_TABLE from dba_queues s where s.OWNER='SYS';
OWNER                          NAME                           QUEUE_TABLE
------------------------------ ------------------------------ ------------------------------
SYS                            SCHEDULER$_EVENT_QUEUE         SCHEDULER$_EVENT_QTAB
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_3_E   KUPC$DATAPUMP_QUETAB_3
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_1_E   KUPC$DATAPUMP_QUETAB_1
SYS                            SYS$SERVICE_METRICS            SYS$SERVICE_METRICS_TAB
SYS                            AQ$_SYS$SERVICE_METRICS_TAB_E  SYS$SERVICE_METRICS_TAB
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_E     KUPC$DATAPUMP_QUETAB
SYS                            AQ_PROP_NOTIFY                 AQ_PROP_TABLE
SYS                            AQ$_AQ_PROP_TABLE_E            AQ_PROP_TABLE
SYS                            AQ_EVENT_TABLE_Q               AQ_EVENT_TABLE
SYS                            AQ$_AQ_EVENT_TABLE_E           AQ_EVENT_TABLE
SYS                            SRVQUEUE                       AQ$_MEM_MC
OWNER                          NAME                           QUEUE_TABLE
------------------------------ ------------------------------ ------------------------------
SYS                            AQ$_AQ$_MEM_MC_E               AQ$_MEM_MC
SYS                            ALERT_QUE                      ALERT_QT
SYS                            AQ$_ALERT_QT_E                 ALERT_QT
SYS                            SCHEDULER_FILEWATCHER_Q        SCHEDULER_FILEWATCHER_QT
SYS                            AQ$_SCHEDULER_FILEWATCHER_QT_E SCHEDULER_FILEWATCHER_QT
SYS                            SCHEDULER$_REMDB_JOBQ          SCHEDULER$_REMDB_JOBQTAB
SYS                            AQ$_SCHEDULER$_REMDB_JOBQTAB_E SCHEDULER$_REMDB_JOBQTAB
SYS                            AQ$_SCHEDULER$_EVENT_QTAB_E    SCHEDULER$_EVENT_QTAB

问题处理:1、尝试清理该表

SQL> select count(1) from SCHEDULER$_EVENT_QTAB;                       
  COUNT(1)
----------
     17711
SQL> truncate table SCHEDULER$_EVENT_QTAB;
truncate table SCHEDULER$_EVENT_QTAB
ERROR at line 1:
ORA-24005: Inappropriate utilities used to perform DDL on AQ table SYS.SCHEDULER$_EVENT_QTAB
SQL> alter session set events '10851 trace name context forever,level 1' ;                 
Session altered.
SQL> truncate table SCHEDULER$_EVENT_QTAB;
Table truncated.
SQL> alter session set events '10851 trace name context off ';
Session altered.
SQL> select count(1) from SCHEDULER$_EVENT_QTAB;
  COUNT(1)
----------
         0

收集统计信息还是报错 。 2、尝试purge该表

DECLARE
po_t dbms_aqadm.aq$_purge_options_t;
BEGIN
  dbms_aqadm.purge_queue_table('SCHEDULER$_EVENT_QTAB', NULL, po_t);
END;
/
收集统计信息还是报错。

3、尝试重建队列任务scheduler$_event_queue(参考文档: DBMS_STATS Fails ORA-06512 and ORA-20001: exception in perform_cleanups: -24010: ORA-24010 (Doc ID 2660765.1)

1) Drop and recreate the SYS.SCHEDULER$_EVENT_QTAB and related queue and underneath AQ objects, as follows:
sqlplus / as sysdba
exec dbms_aqadm.stop_queue(queue_name => 'scheduler$_event_queue');
exec DBMS_AQADM.DROP_QUEUE_TABLE ( QUEUE_TABLE => 'scheduler$_event_qtab',FORCE => true) ;
2) Recreate the queue table:
begin
dbms_aqadm.create_queue_table
(queue_table => 'scheduler$_event_qtab',
queue_payload_type => 'sys.scheduler$_event_info',
multiple_consumers => true,
comment => 'Scheduler event queue table',
secure => true);
exception
when others then
if sqlcode = -24001 then NULL;
else raise;
end if;
end;
/
3) Recreate the queue:
begin
dbms_aqadm.create_queue
(queue_name => 'scheduler$_event_queue',
queue_table => 'scheduler$_event_qtab',
retention_time => 3600,
comment => 'Scheduler event queue');
exception
when others then
if sqlcode = -24006 then NULL;
else raise;
end if;
end;
/
4) Start the queue:
begin
dbms_aqadm.start_queue(queue_name => 'scheduler$_event_queue');
exception
when others then
if sqlcode = -04063 then
dbms_system.ksdwrt(1, 'Error-04063 scheduler$_event_queue will be re-validated');
else
raise;
end if;
end;
/
5) Grant privileges :
begin
dbms_aqadm.grant_queue_privilege('DEQUEUE', 'SYS.SCHEDULER$_EVENT_QUEUE','PUBLIC');
end;
/

尝试收集统计信息,成功。
SQL> select count(1) from SCHEDULER$_EVENT_QTAB;
  COUNT(1)
----------
        17
SQL> select OWNER,NAME,QUEUE_TABLE from dba_queues s where s.OWNER='SYS';
OWNER                          NAME                           QUEUE_TABLE
------------------------------ ------------------------------ ------------------------------
SYS                            SCHEDULER$_EVENT_QUEUE         SCHEDULER$_EVENT_QTAB
SYS                            AQ$_SCHEDULER$_EVENT_QTAB_E    SCHEDULER$_EVENT_QTAB
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_3_E   KUPC$DATAPUMP_QUETAB_3
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_1_E   KUPC$DATAPUMP_QUETAB_1
SYS                            SYS$SERVICE_METRICS            SYS$SERVICE_METRICS_TAB
SYS                            AQ$_SYS$SERVICE_METRICS_TAB_E  SYS$SERVICE_METRICS_TAB
SYS                            AQ$_KUPC$DATAPUMP_QUETAB_E     KUPC$DATAPUMP_QUETAB
SYS                            AQ_PROP_NOTIFY                 AQ_PROP_TABLE
SYS                            AQ$_AQ_PROP_TABLE_E            AQ_PROP_TABLE
SYS                            AQ_EVENT_TABLE_Q               AQ_EVENT_TABLE
SYS                            AQ$_AQ_EVENT_TABLE_E           AQ_EVENT_TABLE
OWNER                          NAME                           QUEUE_TABLE
------------------------------ ------------------------------ ------------------------------
SYS                            SRVQUEUE                       AQ$_MEM_MC
SYS                            AQ$_AQ$_MEM_MC_E               AQ$_MEM_MC
SYS                            ALERT_QUE                      ALERT_QT
SYS                            AQ$_ALERT_QT_E                 ALERT_QT
SYS                            SCHEDULER_FILEWATCHER_Q        SCHEDULER_FILEWATCHER_QT
SYS                            AQ$_SCHEDULER_FILEWATCHER_QT_E SCHEDULER_FILEWATCHER_QT
SYS                            SCHEDULER$_REMDB_JOBQ          SCHEDULER$_REMDB_JOBQTAB
SYS                            AQ$_SCHEDULER$_REMDB_JOBQTAB_E SCHEDULER$_REMDB_JOBQTAB

相关推荐