Пропуск ошибок в репликации транзакций
Для репликации транзакций существует два способа пропуска ошибок, если они возникают во время процесса распространения:
Параметр -SkipErrors агента распространителя, который позволяет пропускать ошибки определенного типа. Транзакция с ошибкой не фиксируется, но последующие транзакции фиксируются.
Хранимая процедура sp_setsubscriptionxactseqno, которая позволяет пропустить одну или несколько транзакций, вызвавших ошибку. Данный параметр недоступен подписчикам, отличным от SQL Server.
Важно! |
---|
Как правило, в процессе репликации не должны появляться ошибки, которые требуется пропускать. Следует осторожно использовать пропуск ошибок и понимать причины ошибки, почему она произошла и почему необходимо пропустить, а не устранить ошибку или определенную транзакцию. Если на подписчике пропускаются транзакции, зафиксированные на издателе, два узла будут синхронизированы не полностью, что может привести к дополнительным ошибкам. |
Параметр «-SkipErrors»
По умолчанию если агент распространителя обнаруживает ошибку, он останавливает работу. Если указан параметр -SkipErrors и ожидаемые ошибки или ошибки, которые не влияют на репликацию, то агент регистрирует сведения об ошибке в журнале и продолжает работу. Например, если требуется, чтобы агент распространителя регистрировал нарушения повторяющегося ключа и продолжал обрабатывать следующие транзакции, укажите, что агент должен пропускать ошибку 2601 (Невозможно вставить повторяющуюся ключевую строку в объект '%.*ls' с уникальным индексом '%.*ls'.) и 2627 (Нарушение %ls ограничения '%.*ls'. Невозможно вставить повторяющийся ключ в объект '%.*ls'.):
-SkipErrors 2601:2627
Наиболее распространенный способ использования параметра -SkipErrors заключается в использовании профиля агента распространителя с названием Продолжать при возникновении ошибок согласованности данных. В этом случае агент распространителя пропускает ошибки 2601, 2627 и 20598 (Строка не обнаружена на подписчике при применении реплицированной команды). Дополнительные сведения см. в разделе Профили агента репликации. В дополнение к этому предопределенному профилю можно указать параметр в создаваемом или изменяемом профиле агента либо в командной строке. Дополнительные сведения см. в следующих разделах.
Как работать с профилями агента репликации (среда SQL Server Management Studio)
Как работать с профилями агента репликации (программирование репликации на языке Transact-SQL)
Важно! |
---|
По умолчанию триггеры выполняются с параметром 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 может использоваться для пропуска одной или нескольких транзакций, вызывающих ошибки при их применении на подписчике. Если произошел сбой и требуется пропустить одну или несколько транзакций:
Выполните процедуру sp_helpsubscriptionerrors на распространителе после остановки агента распространителя. Хранимая процедура возвращает столбец xact_seqno, содержащий регистрационный номер в журнале (LSN) для каждой неудачной транзакции.
Выполните процедуру sp_setsubscriptionxactseqno, указав значение параметра @xact_seqno. Если требуется пропустить все поврежденные транзакции, укажите наибольший номер LSN, возвращенный процедурой sp_helpsubscriptionerrors.
Дополнительные сведения см. в разделах sp_setsubscriptionxactseqno (Transact-SQL) и sp_helpsubscriptionerrors (Transact-SQL).
См. также