Disclaimer

Данный блог является моей личной точкой зрения и не обязательно отражает точку зрения Oracle.

The views expressed on this blog are my own and do not necessarily reflect the views of Oracle

Поиск

Подписка

Oracle Streams для репликации: troubleshooting (часть 6)

08.04.2009 от aryndin99

Продолжение. Начало смотрите в предыдущих поста: часть 1, часть 2, часть 3, часть 4, часть 5.

В предыдущих частям мы видели, что настройка репликации в Oracle Database 11g стала очень простой. После стандартной первоначальной настройки нам требуется запустить буквально одну процедуру для настройки репликации, но простота тут только кажущаяся. Очень редко получается пройти без возникновения каких бы то ни было ошибок. Ниже я приведу шаги, которые нужно предпринять для решения проблем.

Ищем ошибку

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

1. ERROR at line 1:
ORA-23616: Failure in executing block 2 for script 66E3D95F7BE36E8FE040007F01003A24 with
ORA-26727: Cannot alter queue_to_queue property of existing propagation.
ORA-06512: at “SYS.DBMS_RECOVERABLE_SCRIPT”, line 576
ORA-06512: at “SYS.DBMS_RECOVERABLE_SCRIPT”, line 599
ORA-06512: at “SYS.DBMS_STREAMS_MT”, line 7755
ORA-06512: at “SYS.DBMS_STREAMS_ADM”, line 2644
ORA-06512: at “SYS.DBMS_STREAMS_ADM”, line 2705
ORA-06512: at line 2

В этом сообщении об ошибке нас будет интересовать строка "ORA-26727: Cannot alter queue_to_queue property of existing propagation." Это и есть реальная причина ошибки. Тут все просто – идем по ссылке и смотрим почему произошла ошибка.

Иногда бывает не понятна причина ошибки. Такая ситуация у меня возникла при написании пятой части. А именно ошибка ORA-39001: invalid argument value мне ничего не сказала. В этом случае приходится копать глубже. В этом нам помогают следующие представления:

Детальное описание можно найти, пройдя по ссылкам, но я приведу пару понравившихся мне запросов:

  • Запрос выводит список блоков, осуществляющих настройку репликации и их статус. При возникновении ошибки одна строка будет со статусом ERROR. Вот ее и нужно ковырять
    select script_id, status,block_num
    from dba_recoverable_script_blocks order by block_num;
  • Для мониторинга текущего скрипта стоит использовать следующую команду (лучше из SQL Developer):
    select * from dba_recoverable_script_blocks 
    where status='EXECUTING' order by block_num
  • Для просмотра ошибочного блока
    select * from dba_recoverable_script_blocks 
    where status='ERROR' order by block_num
  • Ну и последний простой запрос
    select * from dba_recoverable_script_errors

В будущем нас будет интересовать поле SCRIPT_ID из первого запроса. Если посмотрите выше на ошибку – увидите "66E3D95F7BE36E8FE040007F01003A24" – это и есть SCRIPT_ID. Там же в сообщении об ошибке указан номер ошибочного блока.

Итак Вы смотрите на ошибочный блок PL/SQL (по счастливой случайности состоящий из 40-50 строк) и не понимаете, где-же произошла ошибка. Сообщение об ошибке, к сожалению, не очень информативно. Добро пожаловать на следующий круг ада :) Мы будем брать этот PL/SQL блок и исполнять его в обычном сеансе SQL*Plus. 

В этом случае нужно будет обратить внимание на еще одно поле таблицы DBA_RECOVERABLE_SCRIPT_BLOCKS: FORWARD_BLOCK_DBLINK. Это поле указывает на каком сервере необходимо запускать конкретный блок. Будьте внимательны, когда будете вручную выполнять команды.

Еще одна замечательная особенность программистов Oracle Streams – это обработка исключительный ситуаций например вот так (без комментариев):

EXCEPTION WHEN OTHERS THEN
   ROLLBACK;
  RAISE;
END;

В результате видим вот такое сообщение об ошибке:

ORA-23616: Failure in executing block 5 for script 66E3D95F7BEE6E8FE040007F01003A24 with
ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_RECOVERABLE_SCRIPT", line 576
ORA-06512: at "SYS.DBMS_RECOVERABLE_SCRIPT", line 599
ORA-06512: at "SYS.DBMS_STREAMS_MT", line 7755
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 2644
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 2705
ORA-06512: at line 2

Убрав этот обработчик я получил не сильно детально, но, мне кажется, гораздо более адекватное сообщение об ошибке (по крайней мере видно, что косяк в DATAPUMP). 

ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3043
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4298
ORA-06512: at line 33

Единственное следует обратить внимание на то, чтобы корректно завершать неудавшийся блок (ROLLBACK).

Возобновление работы

Если ошибку удалось устранить, то следует возобновить работу прервавшегося блока. Для этого использует процедуру recover_operation из пакета dbms_streams_adm. Возобновление работы скрипта  делается следующим образом(вместо аргумента нужно подставить номер из сообщения об ошибки, либо из представления DBA_RECOVERABLE_SCRIPT_BLOCKS):

begin
dbms_streams_adm.recover_operation('66E3D95F7BEE6E8FE040007F01003A24','FORWARD');
end;

Откат изменений

Иногда прежде чем исправлять ошибку необходимо откатить изменения, сделанные неудавшимся скриптом. Делается это той же процедурой:

begin
dbms_streams_adm.recover_operation('66E3D95F7BEE6E8FE040007F01003A24','ROLLBACK');
end;

Ну и последнее. Бывает, что скрипт не может откатить свои изменения и приходится вручную удалять процессы, очереди и таблицы например вот так:

Развернуть...

В этом случае может понадобиться команда, которая удалит скрипт из словаря данных:

begin
dbms_streams_adm.recover_operation('66E3D95F7BEE6E8FE040007F01003A24','PURGE');
end;

То, что я тут написал, конечно, не исчерпывающий список того, что можно делать в области troubleshooting, ибо очевидно, что на все воля Металинка :) Одно могу сказать, что в 11-ой версии решении гораздо более зрелое и надежное, чем 10-ой (10R2 – не в счет).

В одной из следующих частей я остановлюсь на вопросах производительности и использовании парочки утилит с металинка, дающих возможность поковыряться в работе Oracle Streams.

Рубрики: Data Warehouse, Data Warehousing, Database, Streams | 1 Комментарий »

Один комментарий

  1. Oracle Spatial, Mapviewer, Semantics и ГИС системы » Архив блога » Oracle Streams для репликации: расширенная настройка (часть 8) пишет:

    [...] пространственных данных (Oracle Spatial, Oracle MapViewer)”Oracle Streams для репликации: troubleshooting (часть 6)Использование Oracle Streams для репликации (часть [...]

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

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.