Os internos do Change Tracking foram alterados do SQL Server 2008 para 2012?


9

Ao solucionar um problema de sincronização de dispositivos desconectados com um servidor de banco de dados central, estamos enfrentando um problema após a atualização para o SQL Server 2012 no servidor. Parece que o CHANGE_TRACKING_MIN_VALID_VERSION está retornando um valor 1 maior do que deveria (ou pelo menos do que antes da atualização).

Eu tenho trabalhado através da grande caminhada de Arshad Ali através do exemplo de como configurar um exemplo simples.

Executei os scripts de 1 a 5 para inserir, excluir e atualizar uma linha na tabela Employee nos ambientes SQL Server 2008 e 2012.

Em 2008, a seguinte declaração retorna um 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

Em 2012, ele retorna 1.

Ao trabalhar com mais alguns scripts (6-8) nos testes, defino o período de retenção para 1 minuto, para forçar uma ação de limpeza. Eu saí para o dia e, aparentemente, correu durante a noite.

Na instância de 2008, CHANGE_TRACKING_CURRENT_VERSION e CHANGE_TRACKING_MIN_VALID_VERSION são iguais (11). Na instância de 2012, o CHANGE_TRACKING_MIN_VALID_VERSION é um mais alto (12) que o CHANGE_TRACKING_CURRENT_VERSION (11). Isso pode ter um impacto no processo de sincronização quando um banco de dados fica ocioso por longos períodos de tempo. E descobrimos que o processo pode ficar preso em um loop, especialmente quando o teste a seguir é executado para determinar se uma reinicialização, em oposição à sincronização, é necessária:

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''...

Alguém mais experimentou essa mudança de comportamento? Alguém tem uma explicação?


2
Há um item do Microsoft Connect para esse problema, connect.microsoft.com/SQLServer/feedback/details/770014/… basicamente, a Microsoft acredita que o problema pode estar relacionado à corrupção no banco de dados em questão. Você pode reproduzir esta situação em um banco de dados recém-criado?
Max Vernon

11
Max, eu revi o artigo do Connect. Infelizmente, o pôster original parece ter abandonado a discussão e a MS encerrou a questão. Ao configurar a reprodução do problema, iniciei o teste com bancos de dados recém-criados em uma instância 2008R2 e 2012. Ambos os bancos de dados parecem estar funcionando normalmente em todos os outros aspectos.
Glenn Estrada

3
Com as etapas de reprodução do problema, informe-o no Connect para que eles possam corrigi-lo!
21813 Jon Seigel

Você alterou o nível de compatibilidade do banco de dados após a atualização? Não uso o acompanhamento de alterações, mas penso em uma incompatibilidade de versão após a atualização.
Guillaume R.

Respostas:


3

Não se usa o min_valid_version para rastrear as alterações. Isso é usado apenas para validar se o seu cliente precisa ser reinicializado, se os metadados foram limpos antes que o cliente possa consumir as alterações.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Obtém a versão mínima válida para uso na obtenção de informações de rastreamento de alterações da tabela especificada quando você estiver usando a CHANGETABLEfunção.

Min_valid_version muda com a versão de limpeza e não depende das alterações na tabela do usuário. Toda vez que o encadeamento de limpeza é executado, pode haver uma atualização para min_valid_version, independentemente das alterações nos dados.

Antes de 2012, min_valid_version era marcado como a versão de limpeza, quando na verdade deveria ser mais uma que a versão de limpeza, pois os metadados dessa versão já foram limpos. Em 2012, foi isso que eles mudaram para garantir a atualização da min_valid_version correta.

Não se deve rastrear alterações usando min_valid_version, mas salvar last_sync_version após cada sincronização e chamar o CHANGETABLEpara enumerar as alterações após a última versão de sincronização.

Por design - a versão válida mínima é alterada com a versão de limpeza e não depende das alterações na tabela do usuário. Toda vez que o encadeamento de limpeza é executado, pode haver uma atualização para a versão mínima válida, independentemente das alterações nos dados.

Resolve - Altere o procedimento para usar 'current_version' em vez de 'min_valid_version'

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.