Пропуск ошибок в репликации транзакций

Для репликации транзакций существует два способа пропуска ошибок, если они возникают во время процесса распространения:

  • Параметр -SkipErrors агента распространителя, который позволяет пропускать ошибки определенного типа. Транзакция с ошибкой не фиксируется, но последующие транзакции фиксируются.

  • Хранимая процедура sp_setsubscriptionxactseqno, которая позволяет пропустить одну или несколько транзакций, вызвавших ошибку. Данный параметр недоступен подписчикам, отличным от SQL Server.

Важное примечаниеВажно!

Как правило, в процессе репликации не должны появляться ошибки, которые требуется пропускать. Следует осторожно использовать пропуск ошибок и понимать причины ошибки, почему она произошла и почему необходимо пропустить, а не устранить ошибку или определенную транзакцию. Если на подписчике пропускаются транзакции, зафиксированные на издателе, два узла будут синхронизированы не полностью, что может привести к дополнительным ошибкам.

Параметр «-SkipErrors»

По умолчанию если агент распространителя обнаруживает ошибку, он останавливает работу. Если указан параметр -SkipErrors и ожидаемые ошибки или ошибки, которые не влияют на репликацию, то агент регистрирует сведения об ошибке в журнале и продолжает работу. Например, если требуется, чтобы агент распространителя регистрировал нарушения повторяющегося ключа и продолжал обрабатывать следующие транзакции, укажите, что агент должен пропускать ошибку 2601 (Невозможно вставить повторяющуюся ключевую строку в объект '%.*ls' с уникальным индексом '%.*ls'.) и 2627 (Нарушение %ls ограничения '%.*ls'. Невозможно вставить повторяющийся ключ в объект '%.*ls'.):

-SkipErrors 2601:2627

Наиболее распространенный способ использования параметра -SkipErrors заключается в использовании профиля агента распространителя с названием Продолжать при возникновении ошибок согласованности данных. В этом случае агент распространителя пропускает ошибки 2601, 2627 и 20598 (Строка не обнаружена на подписчике при применении реплицированной команды). Дополнительные сведения см. в разделе Профили агента репликации. В дополнение к этому предопределенному профилю можно указать параметр в создаваемом или изменяемом профиле агента либо в командной строке. Дополнительные сведения см. в следующих разделах.

Важное примечаниеВажно!

По умолчанию триггеры выполняются с параметром XACT_ABORT установленным в ON. Если инструкция с триггером вызывает ошибку, пока агент распространителя применяет изменения на стороне подписчика, завершится со сбоем работа всего пакета изменений, а не отдельной инструкции. Чтобы пропустить инструкции, вызывающие ошибки, можно указать в репликации транзакций параметр -SkipErrors агента распространителя. Если параметр -SkipErrors указан вместе с XACT_ABORT ON и инструкция вызовет ошибку, то весь пакет изменений будет пропущен. Если указан параметр -SkipErrors, то рекомендуется установить XACT_ABORT в состояние OFF, если в триггерах не требуется установить XACT_ABORT в состояние ON. Чтобы отключить параметр, укажите в определении триггера SET XACT_ABORT OFF. Дополнительные сведения о XACT_ABORT см. в разделе SET XACT_ABORT (Transact-SQL).

Хранимая процедура sp_setsubscriptionxactseqno

Хранимая процедура sp_setsubscriptionxactseqno может использоваться для пропуска одной или нескольких транзакций, вызывающих ошибки при их применении на подписчике. Если произошел сбой и требуется пропустить одну или несколько транзакций:

  1. Выполните процедуру sp_helpsubscriptionerrors на распространителе после остановки агента распространителя. Хранимая процедура возвращает столбец xact_seqno, содержащий регистрационный номер в журнале (LSN) для каждой неудачной транзакции.

  2. Выполните процедуру sp_setsubscriptionxactseqno, указав значение параметра @xact_seqno. Если требуется пропустить все поврежденные транзакции, укажите наибольший номер LSN, возвращенный процедурой sp_helpsubscriptionerrors.

Дополнительные сведения см. в разделах sp_setsubscriptionxactseqno (Transact-SQL) и sp_helpsubscriptionerrors (Transact-SQL).