Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Мусор в AQ  [new]
vmotov
Member

Откуда:
Сообщений: 3
Подскажите, плз.
1) Почему то сообщения с заданым EXPIRATION (2 часа) по истечении срока не переносятся в очередь exception, висят месяцами.

2) В очередь exception сообщения всё-таки попадают и копятся там, как очистить или убить очередь exception.
Вариант 1 скрипт очитски с DEQUEUE.

Oracle 10g
10 июл 07, 18:45    [4374996]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
автор
Time Specification and Scheduling
Messages can be enqueued with an expiration that specifies the interval of time the
message is available for dequeuing. The default for expiration is never. When a
message expires, it is moved to an exception queue. Expiration processing requires
that the queue monitor be running.


Queue Monitor Coordinator
Before 10g Release 1 (10.1), the Oracle Streams AQ time manager process was called
queue monitor (QMNn), a background process controlled by setting the dynamic
init.ora parameter AQ_TM_PROCESSES. Beginning with 10g Release 1 (10.1), time
management and many other background processes are automatically controlled by a
coordinator-slave architecture called Queue Monitor Coordinator (QMNC). QMNC
dynamically spawns slaves named qXXX depending on the system load. The slaves
provide mechanisms for:
■Message delay
■Message expiration
■Retry delay
■Garbage collection for the queue table
■Memory management tasks for buffered messages
Because the number of processes is determined automatically and tuned constantly,
you are saved the trouble of setting it with AQ_TM_PROCESSES.
Although it is no longer necessary to set init.ora parameter AQ_TM_PROCESSES, it
is still supported. If you do set it (up to a maximum of 10), then QMNC still autotunes
the number of processes. But you are guaranteed at least the set number of processes
for persistent queues. Processes for a buffered queue and other Oracle Streams tasks,
however, are not affected by this parameter.
Note: If you want to disable the Queue Monitor Coordinator, then
you must set AQ_TM_PROCESSES = 0 in your pfile or spfile. Oracle
strongly recommends that you do NOT set AQ_TM_PROCESSES = 0.
If you are using Oracle Streams, setting this parameter to zero (which
Oracle Database respects no matter what) can cause serious problems.
10 июл 07, 18:56    [4375038]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Oracle Streams
Advanced Queuing User's Guide and Reference
10g Release 2 (10.2)
B14257-01
цитата постом выше
10 июл 07, 18:57    [4375047]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
vmotov
Member

Откуда:
Сообщений: 3
Запущен,
aq_tm_processes = 1.
И, я же пишу, что сообщения попадают в _E очередь, но вот часть сообщений почему-то "висит".

Вопрос 2. Как очистить или убить _E очередь в лучшем виде?
10 июл 07, 19:04    [4375072]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
vmotov
Member

Откуда:
Сообщений: 3
Пример, сообщения из очереди Q должны быть перемещены в очередь AQ$_Q_TBL_E, но почему-то этого не происходит.
И второй вопрос остаётся открытым.

Q_NAMEMSGIDSTATE EXPIRATIONENQ_TIMESYSDATE
Q34E9FF8BC7C21449E0440003BA0F326A0720010.07.2007 16:47:1211.07.2007 10:10:17
Q34E9A9D4794E3BCEE0440003BA0F326A0720010.07.2007 16:27:0411.07.2007 10:10:17
Q34E9959DC42319AEE0440003BA0F326A0720010.07.2007 16:17:3911.07.2007 10:10:17
AQ$_Q_TBL_E32F7144B1F3E1A5DE0440003BA0F326A3720015.06.2007 21:33:1111.07.2007 10:10:17
AQ$_Q_TBL_E32F7144B1F3C1A5DE0440003BA0F326A3720015.06.2007 21:33:1011.07.2007 10:10:17
AQ$_Q_TBL_E32F6C94B80725E11E0440003BA0F326A3720015.06.2007 21:28:5311.07.2007 10:10:17
11 июл 07, 10:25    [4376573]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
skeptic
Member

Откуда:
Сообщений: 104
в свое время тоже пытался найти способ чистки EXCEPTION QUEUE, но не нашел никаких рабочих примеров, как это делается. В итоге написал сам, на 9.2 работало, на 10g тоже, по идее тоже должно. Хотя не знаю, насколько это грамотный способ. Места, где надо подставить имя очереди/подписчика/типа, на основе которого создана очередь/STORAGE, помечены комментарием:

declare
  TYPE TT2 IS TABLE OF SYS.AQ$_AGENT;
  V_DO              DBMS_AQ.DEQUEUE_OPTIONS_T;
  V_MP              DBMS_AQ.MESSAGE_PROPERTIES_T;
  V_REC             DBMS_AQ.aq$_recipient_list_t;
  V_SIG             SYS.AQ$_SIG_PROP;
  V_MSGID           RAW(32767);
  V_MSGID2          RAW(32767);
  V_PAYLOAD         SYS.AnyData;
  V_COUNTER         NUMBER := 0;
  V_ET              DATE;
  V_STATE           BINARY_INTEGER;
  V_CORR            VARCHAR2(30);
  V_PRIORITY        BINARY_INTEGER;
  V_EXPIRATION      BINARY_INTEGER;
  V_DELAY           BINARY_INTEGER;
  V_ATTEMPTS        BINARY_INTEGER;
  V_SENDER_NAME     VARCHAR2(500);
  V_SENDER_ADDR     VARCHAR2(500);
  V_EXCEPTION_QUEUE VARCHAR2(500);
  V_SENDER_PROTOCOL BINARY_INTEGER;
  RAWDATA           RAW(32767);
  UDATA             USER.QUEUE_TYPE; -- !!!!!!!!!
BEGIN
  V_DO.NAVIGATION    := DBMS_AQ.FIRST_MESSAGE;
  V_DO.WAIT          := DBMS_AQ.NO_WAIT;
  V_DO.CONSUMER_NAME := 'QUEUE_SUBSCRIBER'; -- !!!!!!!!!
  V_DO.DEQUEUE_MODE  := DBMS_AQ.REMOVE_NODATA;
  V_DO.DEQ_CONDITION := NULL;
  --
  dbms_aqadm.start_queue(queue_name => 'AQ$_QUEUE_STORAGE_E', -- !!!!!!!!!
                         enqueue    => false,
                         dequeue    => true);
  FOR REC IN (SELECT *
                FROM QUEUE_Storage -- !!!!!!!!!
               WHERE STATE = 3)
  --AND ROWNUM < 2) 
   LOOP
    DBMS_AQ.AQ$_DEQUEUE(QUEUE_NAME        => 'AQ$_QUEUE_E', -- !!!!!!!!!
                        ENQUEUE_TIME      => v_et,
                        STATE             => V_STATE,
                        OUT_MSGID         => V_MSGID,
                        OUT_CORRELATION   => V_CORR,
                        PRIORITY          => V_PRIORITY,
                        EXPIRATION        => V_EXPIRATION,
                        DELAY             => V_DELAY,
                        ATTEMPTS          => V_ATTEMPTS,
                        EXCEPTION_QUEUE   => V_EXCEPTION_QUEUE,
                        REMOTE_RECIPIENTS => V_REC,
                        SENDER_NAME       => V_SENDER_NAME,
                        SENDER_ADDR       => V_SENDER_ADDR,
                        SENDER_PROTOCOL   => V_SENDER_PROTOCOL,
                        ORIGINAL_MSGID    => V_MSGID2,
                        RAW_USER_DATA     => RAWDATA,
                        OBJECT_USER_DATA  => UDATA,
                        OUT_SIGN          => V_SIG,
                        MSGID             => REC.MSGID);
  END LOOP;
  dbms_aqadm.stop_queue(queue_name => 'AQ$_QUEUE_STORAGE_E'); -- !!!!!!!!!
end;
11 июл 07, 17:43    [4380174]     Ответить | Цитировать Сообщить модератору
 Re: Мусор в AQ  [new]
skeptic
Member

Откуда:
Сообщений: 104
наконец-то появилось свободное время для ковыряния в доках. Как выяснилось, есть штатный способ очитски очереди - dbms_aqadm.purge_queue_table. Но вариант очистки в лучшем виде описан в Note:458845.1. Идея там та же, что и в скрипте, который я предложил выше.

ПС: я не тормоз, просто нет времени на чтение док =)
27 дек 07, 13:01    [5103065]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить