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

Откуда:
Сообщений: 134
Господа, есть проблема. Создал queue table, создал две очереди на неё, обычную и exception. Но сообщения в случае чего попадают в дефолтную очередь исключений "ляляляля_E"... Дроп дефолтной не помог, сообщения остаются в основной с RETRY_COUNT=5 (максимум)...

Я так полагаю что это проблема очереди исключений которую я создал дополнительно - она тупо не работает. В чём может быть причина? Я и проверить-то не могу, очереди exception работают только на dequeue....
16 мар 10, 15:16    [8486667]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Dr. Simon,
1. Какая версия Oracle используется?
2. Приведите скрипты и пояснения к ним для воспроизведения возникшей проблемы.
16 мар 10, 18:42    [8488397]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
Dr. Simon
Member

Откуда:
Сообщений: 134
SQL*Plus
Dr. Simon,
1. Какая версия Oracle используется?
2. Приведите скрипты и пояснения к ним для воспроизведения возникшей проблемы.


1. 10.2.0.4

2.
CREATE OR REPLACE TYPE my_obj AS OBJECT (....
);
/

DECLARE
   c_aq_table CONSTANT VARCHAR2 (100) := 'MY_AQ_TAB';
   c_aq CONSTANT VARCHAR2 (100) := 'MY_AQ';
   c_ex_aq CONSTANT VARCHAR2 (100) := 'MY_EX_AQ';
   c_obj CONSTANT VARCHAR2 (100) := 'MY_OBJ';
   --
   l_index_name VARCHAR2(100);
   l_query_txt VARCHAR2(100);
BEGIN
   -- создаем таблицу для хранения очередей
   -- при этом создаётся дефолтная очередь исключений AQ$_MY_AQ_TAB_E (в ней-то и трабла)
   DBMS_AQADM.create_queue_table (queue_table => c_aq_table, queue_payload_type => c_obj,
      multiple_consumers => FALSE, COMMENT => 'My AQ table');
   --
   -- создаем очередь
   DBMS_AQADM.create_queue (queue_name => c_aq, queue_table => c_aq_table,
      COMMENT => 'My AQ');
   --
   -- разрешаем операции с очередью
   DBMS_AQADM.start_queue (queue_name => c_aq);
   --
   -- создаем очередь исключений
   DBMS_AQADM.create_queue (queue_name => c_ex_aq, queue_table => c_aq_table,
      queue_type => DBMS_AQADM.exception_queue, COMMENT => 'My Exception AQ');
   --
   -- разрешаем операцию вывода из очереди исключений
   DBMS_AQADM.start_queue (queue_name => c_ex_aq, enqueue => FALSE, dequeue => TRUE);
   --
   -- удаляем из таблицы очереди все индексы за ненадобностью
   l_query_txt := 'DROP INDEX AQ$_MY_AQ_TAB_T';
   EXECUTE IMMEDIATE l_query_txt;
   
   l_query_txt := 'DROP INDEX AQ$_MY_AQ_TAB_I';
   EXECUTE IMMEDIATE l_query_txt;

   SELECT index_name 
     INTO l_index_name
     FROM user_indexes
    WHERE index_type = 'NORMAL'
	  AND table_name = 'MY_AQ_TAB'
      AND ROWNUM=1;
   
   l_query_txt := 'ALTER TABLE '||c_aq_table||' DROP CONSTRAINT '||l_index_name;
   EXECUTE IMMEDIATE l_query_txt;

END;
/

Ситуация - когда валятся исключения, они попадают в дефолтную AQ$_MY_AQ_TAB_E, а не в MY_EX_AQ. Причём такое воспроизводится только на одном инстансе, предыдущие установки данной очереди (а их было штук 20-30) такого не давали. В принципе, это очень страшно, но поскольку имя очереди исключений у нас, увы, захардкодено, надо либо код воротить, либо решить данную проблему каким то образом.

Мы пытались:
1. Снести все очереди и поставить заново
2. Дропнуть дефолтную очередь
3. Гуглить

Первое не помогло, второе привело к тому, что бажные сообщения лежат с retry_count=5 мёртвым грузом. Третье тоже не дало результатов. Такое ощущение что очередь MY_EX_AQ принципиально не работает. Проверить это не представляется возможным, т.к. enqueue делать на exception queue нельзя.
17 мар 10, 08:39    [8489670]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Oracle® Streams
Advanced Queuing User's Guide and Reference
10g Release 2 (10.2)
B14257-01
June 2005
Exception Queues

The exception queue is a message property that can be specified during enqueue time.
If an exception queue is not specified, then a default exception queue is used. The
default exception queue is automatically created when the queue table is created.

Покажите как вы ставите сообщения в очередь (enqueue).

Dr. Simon
Причём такое воспроизводится только на одном инстансе, предыдущие установки данной очереди (а их было штук 20-30) такого не давали.
Чем отличается этот "один инстанс" от 20-30 предыдущих?
17 мар 10, 10:25    [8490154]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
Dr. Simon
Member

Откуда:
Сообщений: 134
SQL*Plus, я тоже это читал. Но мы явно прописываем exception queue 'MY_EX_AQ' для таблицы. В user_queues она явно есть, наряду с дефолтной и привязана к этой таблице.

Добавляю вот так:
PROCEDURE send_msg (
      ...)
   IS
      l_message my_obj;
      --
      l_enqueue_options DBMS_AQ.enqueue_options_t;
      l_message_properties DBMS_AQ.message_properties_t;
      --
      l_msgid RAW (16);
   BEGIN
      -- формируем объект
      l_message := my_obj (prop1 =>param1, ...);
      --
      -- устанавливаем свойства сообщения
      l_message_properties.exception_queue := 'MY_EX_AQ';

      --
      -- помещаем сообщение в очередь
      DBMS_AQ.enqueue (queue_name => 'MY_AQ', enqueue_options => l_enqueue_options,
         message_properties => l_message_properties, payload => l_message, msgid => l_msgid);
   END add_event;

А инстанс отличается... ну не более чем все предыдущие друг от друга... сейчас точно сказать не могу, это не наша база. Но пытаюсь выяснить. Ставили раньше на разные базы, которые были на разных операционках - на Windows, на Solaris, и даже на linux'е по-моему была одна. И все 10.2.0.4. Настройки разные были, щас даже не могу сказать какие, давно это было.

Сейчас пробуем рестартовать базу, посмотрим, что из этого выйдет.
17 мар 10, 10:41    [8490290]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Dr. Simon
А инстанс отличается... ну не более чем все предыдущие друг от друга... сейчас точно сказать не могу, это не наша база. Но пытаюсь выяснить. Ставили раньше на разные базы, которые были на разных операционках - на Windows, на Solaris, и даже на linux'е по-моему была одна. И все 10.2.0.4. Настройки разные были, щас даже не могу сказать какие, давно это было.
1. Ищите отличия. Этого за вас здесь никто сделать не сможет.

2. Изменяется ли поведение, если имена очередей указывать с именем схемы?
('MY_SCHEMA.MY_AQ', 'MY_SCHEMA.MY_EX_AQ' вместо 'MY_AQ', 'MY_EX_AQ')

3. Сделайте воспроизводимый Test Case - это поможет, в том числе, при обращении в техподдержку.
Возможно, в процессе его создания вы поймете в чем проблема.
17 мар 10, 11:20    [8490641]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
Dr. Simon
Member

Откуда:
Сообщений: 134
SQL*Plus
Dr. Simon
А инстанс отличается... ну не более чем все предыдущие друг от друга... сейчас точно сказать не могу, это не наша база. Но пытаюсь выяснить. Ставили раньше на разные базы, которые были на разных операционках - на Windows, на Solaris, и даже на linux'е по-моему была одна. И все 10.2.0.4. Настройки разные были, щас даже не могу сказать какие, давно это было.
1. Ищите отличия. Этого за вас здесь никто сделать не сможет.

2. Изменяется ли поведение, если имена очередей указывать с именем схемы?
('MY_SCHEMA.MY_AQ', 'MY_SCHEMA.MY_EX_AQ' вместо 'MY_AQ', 'MY_EX_AQ')

3. Сделайте воспроизводимый Test Case - это поможет, в том числе, при обращении в техподдержку.
Возможно, в процессе его создания вы поймете в чем проблема.


Спасибо за помощь. Я попытаюсь двигаться по этому пути. Но для начала рестарт базы. Помогает иногда в самых странных и безнадёжных случаях.
17 мар 10, 11:37    [8490805]     Ответить | Цитировать Сообщить модератору
 Re: AQ дефолтная очередь исключений  [new]
Dr. Simon
Member

Откуда:
Сообщений: 134
Рестарт базы помог
18 мар 10, 08:57    [8495373]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить