При устранении неполадок, связанных с синхронизацией отключенных устройств с центральным сервером базы данных, мы столкнулись с проблемой после обновления до 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''...
Кто-нибудь еще испытывал это изменение в поведении? У кого-нибудь есть объяснение?
источник
Ответы:
Никто не использует 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'
источник