Изменились ли внутренние компоненты отслеживания изменений с SQL Server 2008 на 2012?

9

При устранении неполадок, связанных с синхронизацией отключенных устройств с центральным сервером базы данных, мы столкнулись с проблемой после обновления до SQL Server 2012 на сервере. Похоже, что CHANGE_TRACKING_MIN_VALID_VERSION возвращает значение на 1 больше, чем должно (или, по крайней мере, больше, чем до обновления).

Я проработал замечательный пример Аршада Али - пример простого примера.

Я запустил сценарии с № 1 по № 5 для вставки, удаления и обновления строки в таблице Employee как в среде SQL Server 2008, так и в среде 2012 года.

В 2008 году следующий оператор возвращает 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

В 2012 году возвращается 1.

Работая с несколькими сценариями (6-8) в тестах, я установил период хранения равным 1 минуте, чтобы, надеюсь, принудительно выполнить очистку. Я ушел на день, и, видимо, он побежал в одночасье.

В примере 2008 года CHANGE_TRACKING_CURRENT_VERSION и CHANGE_TRACKING_MIN_VALID_VERSION равны (11). В экземпляре 2012 года CHANGE_TRACKING_MIN_VALID_VERSION на единицу выше (12), чем CHANGE_TRACKING_CURRENT_VERSION (11). Это может повлиять на процесс синхронизации, когда база данных простаивает в течение продолжительных периодов времени. И мы обнаружили, что процесс может попасть в цикл, особенно когда выполняется следующий тест, чтобы определить, требуется ли повторная инициализация, а не синхронизация:

IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Employee')) > @sync_last_received_anchor 
       RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''...

Кто-нибудь еще испытывал это изменение в поведении? У кого-нибудь есть объяснение?

Гленн Эстрада
источник
2
Для этой проблемы существует пункт Microsoft Connect, connect.microsoft.com/SQLServer/feedback/details/770014/… В основном Microsoft считает, что проблема может быть связана с повреждением в рассматриваемой базе данных. Можете ли вы воспроизвести эту ситуацию во вновь созданной базе данных?
Макс Вернон
1
Макс, я рецензировал статью о Connect. К сожалению, оригинальный плакат, похоже, отказался от обсуждения, и М.С. закрыл вопрос. При настройке воспроизведения проблемы я начал тестирование с вновь созданными базами данных как в экземплярах 2008R2, так и в 2012 году. Обе базы данных работают нормально во всех других аспектах.
Гленн Эстрада
3
С инструкциями по воспроизведению проблемы сообщите об этом в Connect, чтобы они могли это исправить!
Джон Зигель
Изменили ли вы уровень совместимости БД после обновления? Я не использую отслеживание изменений, но думаю о несоответствии версий после обновления.
Гийом Р.

Ответы:

3

Никто не использует min_valid_version для отслеживания изменений. Это используется только для проверки необходимости повторной инициализации вашего клиента, если метаданные были очищены до того, как клиент сможет использовать изменения.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Получает минимальную версию, которая действительна для использования при получении информации об отслеживании изменений из указанной таблицы при использовании CHANGETABLEфункции.

Min_valid_version изменяется в зависимости от версии очистки и не зависит от изменений в пользовательской таблице. Каждый раз при запуске потока очистки может происходить обновление min_valid_version независимо от изменений данных.

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

Не следует отслеживать изменения с помощью min_valid_version, вместо этого следует сохранять last_sync_version после каждой синхронизации и вызывать CHANGETABLEдля перечисления изменений после последней версии синхронизации.

По конструкции - Минимальная допустимая версия изменяется вместе с версией очистки и не зависит от изменений в пользовательской таблице. Каждый раз при запуске потока очистки может происходить обновление до минимально допустимой версии независимо от изменений данных.

Resolve - измените процедуру, чтобы использовать 'current_version' вместо 'min_valid_version'

stacylaray
источник