powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ propagation
25 сообщений из 30, страница 1 из 2
AQ propagation
    #40048821
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу просто уже…
настроить propagation между двумя очередями.

Исходная – в Oracle 18c XE 64-bit under Windows 10.
Что сделал:
1 Есть очередь и таблица очередей с payload = sys.xmltype
2 Есть db_link на target database
Target = Oracle 19c развернута на cloud.oracle.com. Конкретно Autonomous transaction Database.
Имена пользователей что там, что там – одинаковые.
Нюанс имеется – при заходе на cloud надо использовать wallet.
Tnsnames.ora имеет вид
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Cloud1=
(description=
 (retry_count=20)(retry_delay=3)
 (address=(protocol=tcps)(port=1522)(host=adb.somehost.oraclecloud.com))
 (connect_data=
  (service_name=cloud1.adb.oraclecloud.com)
 )
 (security=
  (ssl_server_cert_dn="тут все правильно написано")
 )
)


Вот что создано в пользовательской схеме, откуда собираюсь делать propagation:
Db_link:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create public database link DH
  connect to stern identified by xxx
  using '(description=
 (retry_count=20)(retry_delay=3)
 (address=(protocol=tcps)(port=1522)(host=adb.somehost.oraclecloud.com))
 (connect_data=
  (service_name=cloud1.adb.oraclecloud.com)
 )
 (security=
  (my_wallet_directory=C:\Users\andreyk\ora_cloud)
  (ssl_server_dn_match=true)
  (ssl_server_cert_dn="тут все правильно написано")
 )
)';


Создана очередь, таблица очередей, подписчик и джоб на propagation
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
begin
 
  dbms_aqadm.create_queue_table(queue_table => 'stern.radio',
   queue_payload_type => 'sys.xmltype',multiple_consumers => true);
  dbms_aqadm.create_queue(queue_name => 'stern.radio_q',
  queue_table => 'stern.radio');
  
  dbms_aqadm.add_subscriber(queue_name => 'stern.radio_q',
  subscriber => sys.aq$_agent('oracloud','stern.cloud_q@dh',null),
  queue_to_queue => true);
  dbms_aqadm.schedule_propagation(queue_name => 'stern.radio_q',
  destination => 'stern.cloud_q@dh',start_time => sysdate
); 
  dbms_aqadm.start_queue('stern.radio_q');
end;



На стороне target database в одноименной схеме
Создана очередь и таблица очередей:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'CLOUD_Q',
    queue_table => 'CLOUD_QTAB',
    queue_type => sys.dbms_aqadm.normal_queue,
    max_retries => 5,
    retry_delay => 0,
    retention_time => 0);
end;
begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'CLOUD_QTAB',
    queue_payload_type => 'SYS.XMLTYPE',
    sort_list => 'ENQ_TIME'
');
end;



job_queue_processes на обоих базах имеют ненулевые значения.
Aq_tm_processes тоже.

Локально обе очереди позволяют делать в них enqueue.
Но вот propagation не работает!!! Возвращает ora-02019.
Код: plsql
1.
2.
3.
ORA-02019: описание соединения для удаленной БД не найдено
ORA-06512: на  "SYS.DBMS_AQADM_SYS", line 12675
ORA-06512: на  "SYS.DBMS_AQADM_SYS", line 13095



Что забавно( точнее ни хера не забавно):
Прочие запросы на селект, инсерт в таблицу по данному линку работают.
Обычные джобы – тоже.
Не работает, конкретно и предметно именно advanced queueing.
Хелп плиз…
...
Рейтинг: 0 / 0
AQ propagation
    #40048837
micis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если так:
Код: sql
1.
2.
3.
4.
5.
6.
...
dbms_aqadm.schedule_propagation(queue_name => 'stern.radio_q', destination => 'dh');
...
recipients(1) := SYS.aq$_agent('oracloud', 'CLOUD_Q@dh', null);
msg_properties.recipient_list := recipients;
DBMS_AQ.ENQUEUE(..., message_properties  => msg_properties, ...);
...
Рейтинг: 0 / 0
AQ propagation
    #40048851
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
micis,

буду пробовать.

Пока что ушел в сторону от propagation через dbms_aqadm,
пробую через dbms_propagation_adm.
...
Рейтинг: 0 / 0
AQ propagation
    #40048899
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я может и не в тему, но между 18.6 и 19.3 у меня в свое время тоже не получилось
Точнее, результат был неоднозначный -- то работало, то нет
Честно, пытался следовать всем металинковским нотам, но не помогло -- решили просто написать приблуду, которая сама перекладывает из очередей одной БД в другую
К сожалению


PS. Что хуже всего не поехали очереди и внутри 18.8
...
Рейтинг: 0 / 0
AQ propagation
    #40048985
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перешел на
dbms_propagation_adm.

Поменял алиас в tnsnames.ora на cloud1.adb.oraclecloud.com.
И database link также назвал.
Т.е. привел их в полное соответствие с service_name удаленной базы.

Ошибка теперь - ORA-12514.
...
Рейтинг: 0 / 0
AQ propagation
    #40049089
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм...
Выставил global_names = true ошибка ORA-12514 исчезла, но джоб впал в кому, выдавая в tracefile бесчисленные
Код: plsql
1.
WAIT #2735303298760: nam='Streams AQ: waiting for messages in the queue' ela= 999610 queue id=83326 process#=140716271331016 wait time=3000 obj#=83323 tim=82247751089



Сообщения он ждет , видите ли...
Так оно есть:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare 
   v$opt dbms_aq.enqueue_options_t;
  v$prop dbms_aq.message_properties_t;
  v$mid raw(16); 
 v$send xmltype := xmltype('<G>hhh</G>');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
  v$opt.delivery_mode := dbms_aq.persistent;
  recipients(1) := sys.aq$_agent('ORACLOUD',
      '"STERN"."CLOUD_Q"@CLOUD1.ADB.ORACLECLOUD.COM',null); 
   -- пробовал и без двойных кавычек, без разницы...-- 
  v$prop.recipient_list := recipients; 
     
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q',
    enqueue_options =>  v$opt,
    message_properties => v$prop,
    payload => v$send,msgid => v$mid);
   commit;
end;    


Параметры аудита отключены:
Код: plsql
1.
2.
audit_sys_operations = FALSE
  audit_trail = 'NONE'



Буду копать дальше.
...
Рейтинг: 0 / 0
AQ propagation
    #40049434
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После дальних странствий воротясь...
Висит... не видит сообщений...

Не понял откуда в trace file стойко появляется запись
Код: plsql
1.
dbms_prvtaqis.add_proxy
...
Рейтинг: 0 / 0
AQ propagation
    #40049441
micis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Климов,

Сравни, что бы поле address таблицы user_queue_subscribers и aq$_agent.address совпадало (попробуй полное/короткое имя линка, global_names).
Плюс, посмотри обычным селектом в CLOUD_QTAB поле address.

А пробовал сделать продвижение в исходную базу (дб-линк на локалхост)?


Вячеслав Любомудров
решили просто написать приблуду, которая сама перекладывает из очередей одной БД в другую
Как с производительностью, не сильно просела по сравнению с оракловым продвижением?
...
Рейтинг: 0 / 0
AQ propagation
    #40049443
micis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
micis
Сравни, что бы поле address таблицы user_queue_subscribers и aq$_agent.address совпадало
Поправка: поле destination из user_queue_schedules и поле address из AQ$CLOUD_QTAB.
...
Рейтинг: 0 / 0
AQ propagation
    #40049446
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
micis
Вячеслав Любомудров
решили просто написать приблуду, которая сама перекладывает из очередей одной БД в другую
Как с производительностью, не сильно просела по сравнению с оракловым продвижением?
Да как-то не получилось сравнивать -- оракловое нормально я настроить не смог
У нас идет опрос 4+4 очередей раз в 20 сек. -- вроде бизнес устраивает
...
Рейтинг: 0 / 0
AQ propagation
    #40049814
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
micis,

Он значение схемы и имя очереди в user_queue_subscribers.address заключает в двойные кавычки.
Не думаю, что это можно считать расхождением.

Переключился на propagation между схемами. Как Вячеслав правильно заметил - не работает.
Когда задаю подписчика без линка - Оракл скромно так добавляет в адрес линк @AQ_LOCAL. Пробую с линком сам-на-себя.

P.S. Вячеслав, а в 12.2 с propagation между схемами в одной БД не практиковались?
...
Рейтинг: 0 / 0
AQ propagation
    #40049824
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов,
Код: plsql
1.
2.
3.
dbms_aqadm.schedule_propagation(queue_name => 'stern.radio_q',
  destination => 'dh',start_time => sysdate
); 
...
Рейтинг: 0 / 0
AQ propagation
    #40049847
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов
Переключился на propagation между схемами. Как Вячеслав правильно заметил - не работает.
Не-не
Я сказал, что не смог настроить, возможно просто где-то накосячил. Я это впервые настраивал.
Андрей Климов
Вячеслав, а в 12.2 с propagation между схемами в одной БД не практиковались?
Насколько помню, до этого был опыт только по разжеванным металинковским статьям настроить уведомления о метриках (что-то у меня там с Grid/Cloud Control были проблемы и пришлось быстро рисовать залепу)
...
Рейтинг: 0 / 0
AQ propagation
    #40050003
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов
Не могу просто уже…
настроить propagation между двумя очередями.

Техподдержка молчит?
И обычная, и облачная?
...
Рейтинг: 0 / 0
AQ propagation
    #40050021
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех, получилось однако...
На CLOUD закинуть.
Подробности в скором времени, ибо сутки не спал.
Скажу тока, что пришлось ручками лесть в
aq$_radio_i и править там колонку subscriber#
...
Рейтинг: 0 / 0
AQ propagation
    #40050760
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, к чему я пришел в итоге.

Есть очередь stern.radio_q. Из нее хочу публиковать в две очереди.

  • локальная - stern1.radio1_q
  • на cloud - stern.cloud_q
CLOUD - 19c, точнее
BANNER_FULL"Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.5.0.0.0"

Для соединения с CLOUD создан DB LINK
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create database link DH
  connect to stern identified by xxx
  using '(description=
 (retry_count=20)(retry_delay=3)
 (address=(protocol=tcps)(port=1522)(host=adb.somehost.oraclecloud.com))
 (connect_data=
  (service_name=cloud1.adb.oraclecloud.com)
 )
 (security=
  (my_wallet_directory=C:\Users\andreyk\ora_cloud)
  (ssl_server_dn_match=true)
  (ssl_server_cert_dn="тут все правильно написано")
 )
)';


Памятуя о всяких бяках на самом деле description я вытянул в одну строку, убрав все пробелы.
Все очереди с payload_type = RAW
Параметры
audit_sys_operations FALSE audit_trail NONE global_names FALSE
Подписчики описаны без расхождений с документацией:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
begin
 
  dbms_aqadm.add_subscriber(queue_name => 'stern.radio_q',
  subscriber => sys.aq$_agent(null,'stern1.radio1_q',0),
  queue_to_queue => true);
  
end;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
begin
 
  dbms_aqadm.add_subscriber(queue_name => 'stern.radio_q',
  subscriber => sys.aq$_agent(null,'stern.cloud_q@dh',0),
  queue_to_queue => true);
  

end; 



Под каждого подписчика создан свой шедулер:

Код: plsql
1.
2.
3.
4.
5.
 begin
    dbms_aqadm.schedule_propagation(queue_name => 'stern.radio_q',
  destination => null,start_time => sysdate,
  destination_queue => 'stern1.radio1_q', duration => 185 ); 
 end; 



Код: plsql
1.
2.
3.
4.
5.
 begin
    dbms_aqadm.schedule_propagation(queue_name => 'stern.radio_q',
  destination => 'dh',start_time => sysdate,
  destination_queue => 'stern.cloud_q', duration => 185); 
end; 



Если я в процедуре, или в анонимном блоке, который делает enqueue, явно
специфицирую получателя в recipient_list, вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare 
 v$prop dbms_aq.message_properties_t;
 recipients DBMS_AQ.aq$_recipient_list_t;
...
begin
  
  recipients(1) := sys.aq$_agent(null,
      'stern1.radio1_q',0); 
  v$prop.recipient_list := recipients; 
    
 
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q'...);
   commit;
end;


а для CLOUD так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare 
 v$prop dbms_aq.message_properties_t;
 recipients DBMS_AQ.aq$_recipient_list_t;
...
begin
  
  recipients(1) := sys.aq$_agent(null,
      'stern.cloud_q@dh',0); 
  v$prop.recipient_list := recipients; 
    
 
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q'...);
   commit;
end;


то происходит полная несуразица.
Оракл почему-то не в состоянии сличить этих получателей с тем списком, который он себе завел после процедур add_subscriber!
Джобы виснут, т.к. не видят куда публиковать сообщения из очереди.

Если же я делаю вставку в очередь без всякого указания recipients, то все происходит честно,
сообщение уходит к обоим подписчикам. Т.е. каждый джоб доставляет сообщение, как ему и было указано.
Вот такой вариант, самый простой, без recipients в итоге прокатывает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 begin
  
  /*recipients(1) := sys.aq$_agent(null,
      'stern.cloud_q@dh',0); 
  v$prop.recipient_list := recipients;*/ 
    
 
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q'...);
   commit;
end;



Видимо, если я не хочу, чтобы сообщение отправлялось всем, придется в создание подписчика добавить rule ,
и в момент enqueue делать "целеуказание" с явным прописыванием
свойства сообщения, соответствующему правилу для того пдописчика, которому я это сообщение адресую.
...
Рейтинг: 0 / 0
AQ propagation
    #40050835
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для каждой очереди, намеченной для публикации, т.е. имеющей подписчиков, Оракл держит вспомогательное вью AQ$<queue_table_name> где хранит историю propagation.
В колонках этого вью:

Колонка описание MSG_ID ИД исходного сообщения MSG_STATE Состояние исходного сообщения PROPAGATED_MSGID ИД лоставленного сообщения CONSUMER_NAME Имя подписчика-кому доставлено ADDRESS Адрес подписчика- кому доставлено PROTOCOL Протокол подписчика- кому доставлено

В документации об этом ни слова нет. И, по-моему, это единственный способ очистить очередь - источник от сообщений, отправленных всем получателям в списке. При очистке очереди-источника от сообщений, хранящихся в этой таблице, они из нее также исчезают.
Если задать просто expiration , то есть риск, что сообщение удалится не будучи доставлено всем требуемым подписчикам.
...
Рейтинг: 0 / 0
AQ propagation
    #40050851
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно, что за таблицы, которые Оракл плодит для очередей, вот, что нарыл:

Multiple Consumer Queues Database Objects

AQ$_<queue_table_name>_T e.g AQ$_QT3_T
IOT used queue monitor to manage timed operations

AQ$_<queue_table_name>_I
IOT that maintains state for dequeue operations
One row per message per recipient/subscriber

AQ$_<queue_table_name>_S
Heap table containing information about subscribers

AQ$_<queue_table_name>_H
IOT used to store dequeue history
One row per message per recipient/subscriber

AQ$_<queue_table_name>_G
IOT correlating messages to subscriber signatures
...
Рейтинг: 0 / 0
AQ propagation
    #40050858
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, пошел по тому же пути, что и форумчанин:

https://www.sql.ru/forum/1093254/aq-propagation-i-spisok-poluchateley?hl=schedule_propagation

Столько лет прошло, а Оракл и ухом не ведет...
...
Рейтинг: 0 / 0
AQ propagation
    #40050876
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, спешу напомнить, что если вы хотите, чтобы propagation работало периодически,
то значение параметра next_time следует задавать в кавычках, например
Код: plsql
1.
next_time=> 'sysdate+1'  


В чистом виде значение типа date не поглотит...
...
Рейтинг: 0 / 0
AQ propagation
    #40050904
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов
Для каждой очереди, намеченной для публикации, т.е. имеющей подписчиков, Оракл держит вспомогательное вью AQ$<queue_table_name> где хранит историю propagation.
В колонках этого вью:

Колонка описание MSG_ID ИД исходного сообщения MSG_STATE Состояние исходного сообщения PROPAGATED_MSGID ИД лоставленного сообщения CONSUMER_NAME Имя подписчика-кому доставлено ADDRESS Адрес подписчика- кому доставлено PROTOCOL Протокол подписчика- кому доставлено


В документации об этом ни слова нет. И, по-моему, это единственный способ очистить очередь - источник от сообщений, отправленных всем получателям в списке. При очистке очереди-источника от сообщений, хранящихся в этой таблице, они из нее также исчезают.
Если задать просто expiration , то есть риск, что сообщение удалится не будучи доставлено всем требуемым подписчикам.

Пожалуй, я погорячился... Что за суррогат держит Оракл в этом вью, еще надо разобраться.

Потому что, как только отработают все шедулеры по всем подписчикам, сообщение из очереди автоматически удаляется. В документации об этом нет, но у меня именно так оно и работает.
...
Рейтинг: 0 / 0
AQ propagation
    #40050921
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После

Код: plsql
1.
2.
  noaudit execute on dbms_aqadm
  noaudit execute on dbms_aqadm_sys




можно выставить
Код: plsql
1.
2.
3.
 
  audit_sys_operations = TRUE
  audit_trail = DB



Аудирование вышеупомянутых пакетов , вызывало падение propagation job'a
в удаленную базу с ошибками
ORA-02002: ошибка записи в контрольный журнал
ORA-01024: неверный тип данных в OCI
...
Рейтинг: 0 / 0
AQ propagation
    #40052016
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После выполнения

Код: plsql
1.
2.
noaudit policy ORA_SECURECONFIG;
noaudit policy ORA_LOGON_FAILURES;



Вернул назад
Код: plsql
1.
2.
audit execute on dbms_aq
audit execute on dbms_aqadm



Шедулер перестал ошибаться!
Нет больше ошибок
ORA-02002: ошибка записи в контрольный журнал
ORA-01024: неверный тип данных в OCI
...
Рейтинг: 0 / 0
AQ propagation
    #40052765
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что когда задаешь шедулеру задание распространить сообщение в очередь,
которая для очереди-источника не является подписчиком, AQ автоматически добавляет в таблицу AQ$_<queue_name>_S подписчика с адресом, который совпадает со значением
параметра destination_queue в вызове функции dbms_aqadm.schedule_propagation .
...
Рейтинг: 0 / 0
AQ propagation
    #40053256
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отметим еще, что для того чтобы propagation работала в многопользовательскую очередь,
у очереди-получателя должен быть явно специфицирован хотя-бы один подписчик.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ propagation
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]