Ошибка репликации SQL - строка не найдена на подписчике - PullRequest
1 голос
/ 04 августа 2011

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

Мы выполняем ряд шагов, моментальный снимок создается .. и применяется к реплицированной базе данных. Все хорошо. Нет ошибок.

Затем мы добавляем новую строку в исходную базу данных и взрываемся! Ошибка.

Попытка команды: если @@ trancount> 0 откат тран (Порядковый номер транзакции: 0x000004BE00000558000100000000, идентификатор команды: 1) Сообщения об ошибках: Строка не была найдена на подписчике при применении реплицированной команды. (Источник: MSSQLServer, номер ошибки: 20598)

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

Когда мы выполняем SELECT COUNT (*) как для источника, так и для места назначения, количество строк остается одинаковым, пока мы не сделаем INSERT, и в этот момент источник увеличивается, но место назначения остается тем же ... .

Есть идеи, где мы можем начать искать?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Тьфу ... эта ошибка отстой. Когда вы говорите, что вставили строку, я предполагаю, что вы вставили ее у издателя. Это не сработает; Репликация доставляет команды последовательно. То есть он не будет повторять тот факт, что вы вставили пропущенную строку, пока не пройдет вашу текущую ошибку.

Итак, вот с чего мы начнем. В сообщении об ошибке мы видим порядковый номер транзакции. Мы можем использовать это для определения первичного ключа отсутствующей строки. У дистрибьютора есть хранимая процедура sp_browsereplcmds. Вы можете подключить порядковый номер транзакции для обоих параметров @xact_seqno_start и @xact_seqno_end. Вы также увидите параметр command_id в хранимой процедуре; это соответствует идентификатору команды в вашем сообщении об ошибке. Попробуйте выполнить процедуру только с указанными параметрами. Он должен дать вам команду, которую он пытается выполнить на подписчике. Оттуда вы можете сказать первичному ключу строки, что он пытается обновить или удалить. Затем вы можете вставить строку с этим первичным ключом у подписчика, и репликация будет продолжена.

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

0 голосов
/ 08 января 2014

Это связано с повреждением данных в базе данных издателя. Мы столкнулись с теми же ошибками репликации, когда запускали проверку DBCC DB с возможностью потери данных.

Наконец, мы попытались сделать RCA как

1.) Проверка ошибок хранилища с помощью CHKDSK в автономном режиме 2.) Очистка таблицы, если в ней много данных ... в нашем случае у нас было 40 миллионов строк.

Проблема исчезла после очистки данных в нашем случае

...