Данные не доставляются подписчикам
В случае если данные не доставляются подписчикам, наиболее распространенными являются две причины:
данные не применяются из-за фильтрования, проблемы агента или из-за другой ошибки репликации;
данные удаляются на подписчике после их применения.
Объяснение
Существует несколько вероятных причин, по которым данные не доставляются подписчикам:
Выполнена фильтрация таблицы. Изменения для доставки данному подписчику отсутствуют.
Один или несколько агентов не запущены или завершили работу из-за сбоя.
Подписка на публикацию транзакций была инициализирована без моментального снимка, и на издателе произошли изменения с момента создания публикации.
Репликация выполнения хранимой процедуры для публикации транзакций выдает разные результаты на подписчике.
Хранимая процедура INSERT, применяемая транзакционной статьей, содержит условие, которое не было выполнено.
Данные удалены пользователем, сценарием репликации или другим приложением.
Данные удалены триггером, либо триггер содержит инструкцию ROLLBACK.
Действия пользователя
Прежде чем устанавливать причину, по которой данные не доставляются подписчикам, рекомендуется выполнить проверку или воспользоваться программой tablediff для обнаружения недостающих строк.
Если агент распространителя или агент слияния может быть запущен, определите, отсутствуют ли данные, запустив проверку двоичной контрольной суммы. Также можно использовать проверку по количеству строк, но этот метод не позволяет обнаружить разницу в содержимом данных. Дополнительные сведения см. в разделе Проверка реплицированных данных.
Если агент распространителя или агент слияния не могут быть запущены, определите, происходит ли потеря данных, запустив программу tablediff. Дополнительные сведения об использовании этой программы для реплицированных таблиц см. в разделе Как сравнить реплицируемые таблицы на предмет различий (программирование репликации).
Устранение причины потери данных
Следующие действия позволяют устранить причины, перечисленные в разделе «Объяснение».
Выполнена фильтрация таблицы. Изменения для доставки данному подписчику отсутствуют.
Возможно, строки, отсутствующие в подписчике, не были реплицированы, поскольку они не соответствуют критериям фильтрации публикации. Все типы репликации поддерживают статические фильтры; кроме того, репликация слиянием поддерживает параметризованные фильтры и фильтры соединения. Дополнительные сведения см. в разделе Фильтрование опубликованных данных. При фильтрации одной или нескольких статей публикации выполните следующие процедуры и проверьте значение предложения фильтра.
Статический фильтр для моментального снимка и публикаций транзакций: столбец filter_clause, возвращаемый хранимой процедурой sp_helparticle (Transact-SQL).
Статический фильтр или параметризованный фильтр для публикаций слиянием: столбец subset_filterclause, возвращаемый хранимой процедурой sp_helpmergearticle (Transact-SQL).
Фильтр соединения для публикаций слиянием: столбец join_filterclause, возвращаемый хранимой процедурой sp_helpmergefilter (Transact-SQL).
Использование предложение фильтра для определения соответствия отсутствующих строк критериям фильтрации. Например предложение фильтра можно выполнить в таблице издателя и определить, соответствуют ли возвращаемые данные данным на подписчике.
Один или несколько агентов не запущены или завершили работу из-за сбоя:
При инициализации подписки убедитесь, что работа агента моментальных снимков публикации завершена, прежде чем применять моментальный снимок с помощью агента распространителя или агента слияния. При попытке применения моментального снимка до его полного завершения выводится следующее сообщение об ошибке: «Исходный моментальный снимок публикации "%s" еще недоступен».
При репликации транзакций убедитесь, что агент распространителя и агент чтения журнала выполняются; при репликации слиянием убедитесь, что агент слияния выполняется. Дополнительные сведения о запуске этих агентов см. в разделах Как запустить и остановить агент репликации (среда SQL Server Management Studio) и Основные понятия об исполняемых объектах агента репликации.
Если агент прекращает работу из-за ошибки, просмотрите описание ошибки для этого агента и установите ее причину. Дополнительные сведения о просмотре сведений об ошибках агента моментальных снимков и агента чтения журнала см. в разделе Как просмотреть сведения и выполнить задачи для агентов, связанных с публикацией (монитор репликации). Дополнительные сведения об агенте распространителя и агенте слияния см. в разделе Как просмотреть сведения и выполнить задачи для агентов, связанных с подпиской (монитор репликации). Если ошибка продолжает возникать, увеличьте протоколирование агента и укажите выходной файла для журнала. В зависимости от контекста ошибки, эта мера может помочь в определении шагов, которые приведут к ошибке и/или дополнительным сообщениям об ошибке. Дополнительные сведения см. в разделе Агенты репликации (диагностика).
Распространенные ошибки, из-за которых данные не доставляются, включают нарушения ограничений и проблемы, связанные с разрешениями. Дополнительные сведения о проблемах, связанных с разрешениями, см. в разделе Репликация данных может не выполняться из-за сбоев в защите. Нарушения ограничений не позволяют включать строки в подписчик.
В репликации транзакций нарушения ограничений рассматриваются как ошибки; по умолчанию при возникновении этих ошибок агент распространителя останавливает синхронизацию (сведения о пропуске этих ошибок см. в разделе Пропуск ошибок в репликации транзакций). В репликации слиянием нарушения ограничений рассматриваются как конфликты; они регистрируются, но не вызывают прекращения синхронизации агентом слияния. В обоих типах репликации нарушения ограничений могут привести к отсутствию конвергенции данных, если вставка, обновление или удаление, завершившиеся успешно на одном узле, не завершатся успешно на другом узле.
При публикации таблицы параметры схемы по умолчанию указывают, что ограничения внешнего ключа и проверочные ограничения должны быть созданы в базе данных подписки при установленном параметре NOT FOR REPLICATION. Если для приложения необходимы другие настройки ограничений, измените параметры схемы. Дополнительные сведения см. в разделах Как указать параметры схемы (среда SQL Server Management Studio) и Как задать параметры схемы (программирование репликации на языке Transact-SQL).
Подписка на публикацию транзакций была инициализирована без моментального снимка, а на издателе произошли изменения с момента создания публикации:
При включении для публикации инициализации из резервной копии изменения опубликованных таблиц отслеживаются в журнале базы данных публикации с момента создания публикации. При инициализации подписки отложенные изменения доставляются подписчику до тех пор, пока они доступны в базе данных распространителя.
В отличие от инициализации из резервной копии при инициализации подписки с использованием параметра replication support only во время добавления подписки необходимо убедиться, что данные и схема правильно синхронизируются. Например если между моментом копирования данных и схемы в подписчик и моментом добавления подписки издатель активен, то изменения данных, которые произошли в результате этой активности, могут не реплицироваться в подписчик.
Дополнительные сведения см. в разделе Инициализация подписки на публикацию транзакций без моментального снимка.
Репликация выполнения хранимой процедуры для публикации транзакций выдает разные результаты на подписчике.
При репликации выполнения хранимой процедуры определение процедуры реплицируется на подписчик при инициализации подписки; когда процедура выполняется на издателе, репликация выполняет соответствующую процедуру на подписчике. Дополнительные сведения см. в разделе Публикация выполнения хранимых процедур в репликации транзакций.
Если хранимая процедура выполняет другое действие на подписчике или работает с данными, отличными от данных издателя, может возникнуть расхождение в данных. Рассмотрим процедуру, которая выполняет расчеты и затем вставляет данные, в зависимости от результатов вычислений. Если подписчик фильтруется таким образом, что вычисления на подписчике будут использовать другие данные, результат, вставляемый на подписчик, может быть иным, либо не произойдет никакой вставки данных.
Хранимая процедура INSERT, применяемая транзакционной статьей, содержит условие, которое не было выполнено.
По умолчанию при репликации транзакций используется набор хранимых процедур для распространения изменений на подписчики. Данные процедуры могут быть изменены с целью включения бизнес-логики, необходимой для приложения. Дополнительные сведения см. в разделе Указание способа распространения изменений для статей транзакций. Если хранимая процедура INSERT содержит в своей логике условие, которое не выполняется, вставка не происходит. Рассмотрим процедуру, которая настроена на проверку определенного значения в таблице подписчика (таблица А), прежде чем разрешить вставку данных в другую таблицу (таблица B). Если значение отсутствует в таблице А вследствие ошибки или из-за того, что данные еще не реплицированы в данную таблицу, ожидаемая строка будет отсутствовать в таблице В.
Данные удаляются пользователем, сценарием репликации или другим приложением.
Чтобы разрешить пользователям удалять данные на подписчике, необходимо использовать репликацию слиянием, репликацию транзакций с обновляемыми подписками или одноранговую репликацию транзакций. Удаления распространяются на издатель, поэтому данные на издателе и подписчике в конечном итоге совпадают. Дополнительные сведения см. в разделах Обзор репликации слиянием и Типы публикации для репликации транзакций.
Если необходимо предотвратить удаление данных пользователями на подписчике, создайте для каждой таблицы триггер, содержащий слово ROLLBACK и используйте параметр NOT FOR REPLICATION (который предотвращает запуск триггера, когда агент репликации выполняет операцию). Например:
USE AdventureWorks GO CREATE TRIGGER prevent_user_dml ON Person.Address FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION AS ROLLBACK
Дополнительные сведения см. в разделах CREATE TRIGGER (Transact-SQL) и Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».
Репликация позволяет выполнять сценарии до и после применения моментального снимка, а также во время синхронизации. Параметры @pre_snapshot_script и @post_snapshot_script хранимых процедур sp_addpublication и sp_addmergepublication позволяют указать сценарии, которые запускаются до и после применения моментального снимка. Дополнительные сведения см. в разделе Выполнение сценариев до и после применения моментального снимка. Хранимая процедура sp_addscriptexec позволяет выполнять сценарий во время процесса синхронизации. Дополнительные сведения см. в разделе Как выполнять сценарии во время синхронизации (программирование репликации на языке Transact-SQL).
Эти сценарии обычно используются для административных задач, таких как добавление имен входа на подписчик. Если сценарии используются для удаления данных на подписчике, который должен быть доступен только для чтения, администратору следует убедиться, что это не приведет к отсутствию конвергенции данных.
Данные удаляются триггером, либо триггер содержит инструкцию ROLLBACK.
Следует правильно управлять триггерами на подписчике, чтобы они не привели к отсутствию конвергенции или возникновению других проблем.
Триггеры должны вызывать изменения данных на подписчике, только если используется репликация слиянием, репликация транзакций с обновляемыми подписками или одноранговая репликация транзакций. Дополнительные сведения см. в разделах Обзор репликации слиянием и Типы публикации для репликации транзакций.
Во многих случаях в триггерах должен использоваться параметр NOT FOR REPLICATION. Если триггер содержит инструкцию ROLLBACK и при этом в нем не используется параметр NOT FOR REPLICATION, строки, реплицированные на подписчик, могут быть не применены.
Для репликации транзакций существуют дополнительные вопросы, касающиеся параметра XACT_ABORT и использования в триггере инструкций COMMIT и ROLLBACK. Дополнительные сведения см. в подразделе «Триггеры» раздела Вопросы использования репликации транзакций.