Buffered Messaging (Queue)

Начиная с 10gR2 официально появился механизм очередей, чьи сообщения хранились не в таблице, а прямо в SGA.
Кажется, изначально это было придумано еще для Oracle Streams, и возможно механизм существовал еще раньше.

Конечно, обмен через такие очереди существенно быстрее, чем через persistent, зато в случае сбоя сообщения теряются.

Познакомиться, как это работает, можно в документации.

Но декларируется, что этот механизм работает в RAC !
И даже больше. Кажется, что именно через buffered queue работают dbms_schedule и data pump.

А раз так, настройка этого механизма становиться жизненно важной.

К нашему ужасу, после установки кластера при попытке работы с buffered queue с разных узлов мы получили сообщение:
ORA-25306 CANNOT CONNECT TO BUFFERED QUEUE'S OWNER INSTANCE


Оказалось, что для обращение с другого узла используется механизм db link. Т.е. сессия при первом обращении строит db link, затем через него обращается к другому узлу. Так вот, из-за этого механизма и могут проистекать разные проблемы.

Конечно у Вас должен быть установлен параметр REMOTE_LISTENER, но будьте аккуратны при написании соответсвующего alias в tnsnames. Он парсится для построения db link.
Затем, у Вас должен быть установлен параметр db_domain.
И конечно заданы значения для STREAM_SIZE.


На основании информации REMOUTE_LISTENER и tnsnames.ora и строится db link. Его можно посмотреть с помощью запроса

select OWNER, DB_LINK, USERNAME, HOST from DBA_DB_LINKS where db_link like '%AQ$%'


а затем и протестировать

select 'x' from dual@your_db_link_name_here


И только если такой запрос пройдет, у Вас начнут работать buffered queue в среде RAC.

Кстати, так как используется db link, то не пытайтесь создавать buffered queue в схеме sys.
Подсоединиться как sys через db link Вам никогда не удасться.

PS

Кстати, после изменения параметра db_domain пришлось перестроить репозиторий DB Control. Об этом напишу в одном из следующих постов.

Как мне кажется, проблемы с buffered queue возникают из-за того, что при работе DBCA вводится не полное имя БД (БД + домен), а короткое.

PS
Внимательные пользователи заметят, что читаться очередь между узлами пойдет ...через публичную сеть.
Поддерживаемого workaround пока я не знаю.

Комментариев нет:

Отправить комментарий