Пустые столбцы XML во время репликации SQL Server - PullRequest
3 голосов
/ 29 марта 2011

У нас есть настройка репликации слиянием на SQL Server, которая выглядит следующим образом: 1 SQL-сервер в офисе, еще один SQL-сервер, путешествующий по всему миру.Издателем является сервер SQL в офисе.

Примерно в 1% случаев две наши таблицы со столбцом типа данных XML (не привязанным к схеме) реплицируются со строками, содержащимипустые столбцы XML. (это происходило только тогда, когда данные отправлялись с «путешествующего сервера» домой, но, опять же, данные там, похоже, чаще менялись).У нас есть только это в продукт.среда (репликация WAN).

Вещи, которые я проверил:

  • Строка реплицируется, так как дата последней модификации в строке обновляется, но столбец xml пуст.Конечно, он не является пустым на другом SQL Server.
  • В интерфейсе конфликтов репликации не отображаются конфликты.
  • Это не вызвано размером данных в столбце XML, так как некоторыеочень малы.
  • Обычно проблема возникает в пакетном режиме.(Столбец xml из 8-9 последовательных строк будет пустым)
  • Проблема возникает, если строка была вставлена ​​ИЛИ обновлена.Никакого паттерна там нет.
  • Кажется, проблема возникает, но это чистое предположение с моей стороны, когда связь слабее.(Мы видели, как эта проблема случалась чаще, когда сервер находился далеко, по сравнению с тем, когда он был рядом.)

Извините, если я запутал некоторые вещи, я не являюсь администратором базы данных,больше DEV со знанием SQL, но так как приложение, использующее базу данных, постоянно обвиняется в проблемах (столбец XML не должен быть пустым !!), я взял за душу, чтобы попытаться найти проблему, а не просто вручную исправлятьданные каждый раз (какая польза от репликации, если вам нужно это делать?)

Если кто-то может помочь с этой проблемой или, по крайней мере, предложить несколько способов отладки / исследования этой проблемы, было бы оченьоценили.Я сделал много поиска в Google, и я нашел это: Hot Fix .Но у нас есть последний пакет обновления, и проблема кажется немного другой.

fyi: У нас здесь локально настроена репликация, но проблема никогда не возникает.Мы также попробуем симулятор WAN, чтобы посмотреть, поможет ли это.

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

Редактировать: теперь доступно исправление для моей проблемы: http://support.microsoft.com/kb/2591902

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

Создание 2 таблиц - один родитель и один дочерний элемент (имеют отношение PK-FK)

Вставка 2строк в родительской таблице

Настроить репликацию - настроить агент слияния на запуск ПО ЗАПРОСУ

Синхронизация

После того, как все будет реплицировано:

На ИЗДАТЕЛЕ:удалить одну строку из родительской таблицы

На АБОНЕНТЕ: вставить 2 строки данных, которые ссылаются на парентиду, которую вы удалили выше

Вставить 5 строк данных, которые ссылаются на парентиду, которая останется в таблице

Синхронизация, агент слияния завершится неудачно, Синхронизация снова, агент слияния завершится успешно

Отсутствуют данные XML на издателе в 5 строках.

Кажется, что это ошибкав SQL Server 2005/2008 и 2008R2.Это будет исправлено в исправлении в 2008 году и позже.(Поскольку SQL Server 2005 больше не изменяется)

Cheers.

0 голосов
/ 17 мая 2011

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

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

После некоторой трассировки SQL и подробного ведения журнала, вот мои выводы: При репликации строки со столбцом XML процесс выполняется в 2 этапа. Сначала выполняется вставка полной строки, но с пустой строкой для столбца XML. Сразу после этого выполняется обновление со столбцом XML, содержащим данные. Поскольку ссылка медленная, в некоторых ситуациях произошло нарушение внешнего ключа. В этом случае таблица 2 зависит от таблицы 1. После завершения репликации table1 и начала репликации table2 (перечисление вставки / обновлений, которое занимает медленное соединение), некоторые записи были добавлены в table1 и table2. Поэтому некоторые вставки в Таблицу 2 завершились неудачно, потому что записи Таблицы не были в базе данных и собирались реплицироваться только в следующем пакете. В следующий раз, когда произошла репликация, больше не происходило нарушений внешнего ключа, однако при попытке вставить строку, которая ранее была неудачной в таблице 2 (строка столбца XML), отсутствовала часть обновления (я мог видеть это в профилировщике SQL). ) и именно поэтому строка завершилась после того, как все было сделано с пустым XML.

Установка «Enforce for replication» в false на внешних ключах, кажется, решает проблему, однако я все еще думаю, что весь этот процесс должен работать с параметром, установленным в true.

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

Я читал эту статью: http://msdn.microsoft.com/en-us/library/ms152529(v=SQL.90).aspx. Но для меня установка этой опции на false - своего рода обходной путь, не так ли?

Что вы, ребята, думаете?

ps: Надеюсь, это понятно, пытался объяснить это как мог. Английский не мой родной язык.

0 голосов
/ 29 марта 2011

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

...