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

Откуда:
Сообщений: 20
Создаю stream repplication:
connect repadmin@source_db
begin
  DBMS_STREAMS_ADM.SET_UP_QUEUE(
    queue_table         => 'capture_stream_qt',
    queue_name          => 'capture_stream_q');
  
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name          =>   'user.strmtest',
    streams_type        =>   'capture',
    streams_name        =>   'capture_stream',
    queue_name          =>   'capture_stream_q',
    include_dml         =>   TRUE,
    include_ddl         =>   TRUE,
    include_tagged_lcr  =>   TRUE,
    source_database     =>   'source_db',
    inclusion_rule      =>   TRUE,
    and_condition       =>   NULL);
end;
/

connect repadmin@dest_db
begin
  DBMS_STREAMS_ADM.SET_UP_QUEUE(
    queue_table         => 'apply_stream_qt',
    queue_name          => 'apply_stream_q');
  
  DBMS_STREAMS_ADM.ADD_TABLE_RULES(
    table_name          =>   'user.strmtest',
    streams_type        =>   'apply',
    streams_name        =>   'apply_stream',
    queue_name          =>   'apply_stream_q',
    include_dml         =>   TRUE,
    include_ddl         =>   TRUE,
    include_tagged_lcr  =>   TRUE,
    source_database     =>   'source_db',
    inclusion_rule      =>   TRUE,
    and_condition       =>   NULL);
end;
/

connect repadmin@source_db
begin
  dbms_streams_adm.add_global_propagation_rules(
    streams_name           => 'capture_stream',
    source_queue_name      => 'capture_stream_q',
    destination_queue_name => 'apply_stream_q@dest_db',
    include_dml            => TRUE,
    include_ddl            => TRUE,
    include_tagged_lcr     => FALSE,
    source_database        => 'source_db',
    inclusion_rule         => TRUE,
    and_condition          => NULL,
    queue_to_queue         => NULL);
end;
/

connect repadmin@dest_db
begin
  dbms_apply_adm.set_parameter (
    apply_name	=> 'apply_stream',
    parameter	=> 'disable_on_error',
    value	=> 'N');

  DBMS_APPLY_ADM.START_APPLY(
    apply_name  => 'apply_stream');
end;
/

connect repadmin@source_db
begin
  DBMS_CAPTURE_ADM.START_CAPTURE(
    capture_name  => 'capture_stream');
end;
/
Все нормально создается. Выполняю insert на source_db:
capture и propagation вроде отрабатывают, а вот apply - нет (смотрю статистику в Oracle enterprise mannager). В логах ошибок найти не могу. Может ктонибудь подскажет, где именно смотреть ошибки? Возможно необходимо перегрузить dml_handler?
13 окт 08, 12:46    [6297099]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает apply в stream repplication не отрабатывает  [new]
VSokol
Member

Откуда:
Сообщений: 12
Некоторые проблемы со стримами можно увидеть в оракловом alert логе.
У вас действительно отработали capture и propagation? Как вариант, можно посмотреть наличие данных в очередях.
В каких состояниях находятся стримовые процессы?
Что подразумевается под перегрузкой dml_handler'а? Как видно из кода, вы не используете свой dml_handler, а пользуетесь встроенным.
14 окт 08, 10:37    [6302087]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает apply в stream repplication не отрабатывает  [new]
LeopoldStoch
Member

Откуда:
Сообщений: 20
В allert log ничего по теме не заметил. Я предположил, что capture и propagation отрабатывают, потому что в oracle enterprise manager по этим стримам есть статистика. Что касается данных в очередях, то некоторые данные есть в таблицах:
AQ$_*_S, AQ$_*_P, AQ$_*_D
Причем в capture_stream записей больше, чем в apply_stream
Как можно посмотреть наличие данных, конкретно в очередях?
o.O
Пытался что то сделать и наткнулся на удивительный результат:
dml изменения не отрабатывают, но после выполнения ddl команды на source_db, отрабатывается и ddl и все предидущие dml. С чем это может быть связано?
15 окт 08, 14:45    [6309669]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает apply в stream repplication не отрабатывает  [new]
VSokol
Member

Откуда:
Сообщений: 12
Наличие данных в очередях, как вариант, можно посмотреть в Enterprise Manager Console в разделе Distributed -> Advanced Queues -> Queue Tables. Правой кнопкой мыши на таблице очередей "Display Messages...". Так как в стримах используется buffered queue, то вы можете не увидеть сообщений в таблицах через SQLPlus, а Enterprise Manager Console позволяет просматривать сообщений в buffered queue (по крайней мере в стримовых очередях).
Изменение из базы источника в базу приемника приходят не сразу (с задержкой). Если транзакция не завершена, то данные не будут переданы. Возможно , в вашем случае вы не закомители транзакцию, а выполнения ddl команды равносильно комиту (coomit, ddl, commit).
Какую версию базы вы используете? Какой объем данных предполагается реплицировать?
В технологии Oracle Streams с спользованием процессов capture, propagation и aplly одним из самых узких мест является propagation. Если Вам нужна передача большого объема данных, например лимонов 5 в час, и вы используете версию не ниже 10.2, то стоит посмотреть в сторону DownStream технологии.
16 окт 08, 12:52    [6314628]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает apply в stream repplication не отрабатывает  [new]
LeopoldStoch
Member

Откуда:
Сообщений: 20
Огромное спасибо!
Commit решил все проблемы (думал, что autocommit включен).
16 окт 08, 14:46    [6315548]     Ответить | Цитировать Сообщить модератору
 Re: Не отрабатывает apply в stream repplication не отрабатывает  [new]
LeopoldStoch
Member

Откуда:
Сообщений: 20
У меня новая проблема. Отрабатывают ddl изменения, но не отрабатывают dml изменения (не вызывается dml_handler). С чем это может быть связаног?
6 ноя 08, 17:14    [6404877]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить