Используйте параметр -SkipErrors в агент распространения

В этой статье описывается использование -SkipErrors параметра в агент распространения.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 327817

Сводка

Microsoft SQL Server включает новый параметр -SkipErrors в агент распространения, который позволяет агент распространения пропускать указанную ошибку в репликации транзакций и продолжать процесс распространения.

Следующий фрагмент из раздела Обработка ошибок агента в SQL Server электронной документации:

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

Корпорация Майкрософт рекомендует использовать этот параметр осторожно и только в том случае, если вы хорошо понимаете следующее:

  • Что указывает на ошибку.
  • Почему возникает ошибка.
  • Почему лучше пропустить ошибку, а не решать ее.

Если вы не знаете ответы на эти элементы, неправильное -SkipErrors использование параметра может привести к несоответствию данных между издателем и подписчиком. В этой статье описаны некоторые проблемы, которые могут возникнуть при неправильном -SkipErrors использовании параметра.

Дополнительная информация

При репликации транзакций изменения данных на издателе распространяются на подписчика в единице транзакции.

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

Например:

У вас есть транзакция, ожидая репликации в таблицу подписчика с именем T1. Эта транзакция включает 100 инструкций insert. Когда он применяется к подписчику, первые 90 вставляется правильно; однако девяносто первая инструкция insert завершается сбоем, и возникает ошибка нарушения первичного ключа 2627.

Если параметр не используется -SkipErrors (поведение по умолчанию):

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

При использовании -SkipErrors параметра:

Агент распространения регистрирует ошибку в журнале агент распространения, пропускает эту ошибку, а затем продолжает процесс распространения. Таким образом, за исключением девяносто первой новой записи, вызвавшей ошибку, другие 99 новых записей вставляются в таблицу подписки. Эта транзакция не применяется повторно агент распространения даже после того, как вы вручную исправите ошибку на подписчике. Таким образом, в этой ситуации у подписчика отсутствует девяносто первая новая запись и возникает проблема с несоответствием данных.

Кроме того, необходимо учитывать, что в SQL Server 2000 г. обычно агент распространения совместно используется несколькими публикациями (по умолчанию на каждую пару базы данных публикации и базы данных подписки используется один агент распространения), поэтому при добавлении -SkipErrors параметра в агент распространения задание, оно влияет на все публикации, обслуживаемые этим агентом. В версиях SQL 2005 и SQL 2008 репликация транзакций по умолчанию использует независимые агенты для публикаций, созданных в мастере создания публикаций. Для публикаций, созданных с помощью sp_addpublication хранимой процедуры, по умолчанию используется общий агент.

Чтобы использовать -SkipErrors параметр для конкретной публикации, используйте независимый агент, который обслуживает только одну подписку. Чтобы использовать независимый агент, выполните действия для своей версии.

SQL Server 2000

  1. В диспетчере SQL Server Enterprise щелкните правой кнопкой мыши публикацию, выберите и Propertiesна вкладке Параметры подписки выберите параметр Использовать агент распространения, независимо от другой публикации из этой базы данных.

    Примечание.

    Этот параметр нельзя включить после добавления подписок в эту публикацию.

  2. -SkipErrors Добавьте параметр в агент распространения определенной подписки.

SQL Server 2005 и SQL Server 2008

  1. В студии управления SQL Server перейдите в раздел Репликация, а затем в разделе Локальные публикации щелкните правой кнопкой мыши публикацию, выберите пункт Свойства, а затем на странице Параметры подписки измените значение Параметра независимой агент распространения с False на True.

    Примечание.

    Этот параметр нельзя включить после добавления подписок в эту публикацию.

  2. -SkipErrors Добавьте параметр в агент распространения определенной подписки.

Дополнительные сведения см. в указанных ниже статьях.