Gli interni di rilevamento delle modifiche sono cambiati da SQL Server 2008 a 2012?


9

Durante la risoluzione di un problema relativo alla sincronizzazione dei dispositivi disconnessi con un server di database centrale, riscontriamo un problema dopo l'aggiornamento a SQL Server 2012 sul server. Sembra che CHANGE_TRACKING_MIN_VALID_VERSION stia restituendo un valore 1 superiore a quello che dovrebbe (o almeno rispetto a prima dell'aggiornamento).

Ho lavorato attraverso la grande camminata di Arshad Ali attraverso l'esempio di come creare un semplice esempio.

Ho eseguito gli script dal n. 1 al n. 5 per inserire, eliminare e aggiornare una riga nella tabella Employee in un ambiente SQL Server 2008 e 2012.

Nel 2008, la seguente dichiarazione restituisce uno 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

Nel 2012, restituisce un 1.

Lavorando con alcuni altri script (6-8) nei test, ho impostato il periodo di conservazione su 1 minuto per forzare, si spera, un'azione di pulizia. Sono partito per il giorno e apparentemente ha funzionato durante la notte.

Nell'istanza del 2008, CHANGE_TRACKING_CURRENT_VERSION e CHANGE_TRACKING_MIN_VALID_VERSION sono uguali (11). Nell'istanza del 2012, CHANGE_TRACKING_MIN_VALID_VERSION è uno superiore (12) rispetto a CHANGE_TRACKING_CURRENT_VERSION (11). Ciò potrebbe avere un impatto sul processo di sincronizzazione quando un database è inattivo per lunghi periodi di tempo. E abbiamo scoperto che il processo potrebbe rimanere bloccato in un ciclo, specialmente quando viene eseguito il seguente test per determinare se è necessaria una reinizializzazione, al contrario della sincronizzazione:

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

Qualcun altro ha sperimentato questo cambiamento nel comportamento? Qualcuno ha una spiegazione?


2
Esiste un elemento di Microsoft Connect per questo problema, connect.microsoft.com/SQLServer/feedback/details/770014/… sostanzialmente Microsoft ritiene che il problema potrebbe essere correlato alla corruzione nel database in questione. Puoi riproporre questa situazione in un database appena creato?
Max Vernon,

1
Max, ho recensito l'articolo Connect. Sfortunatamente, il poster originale sembra aver abbandonato la discussione e MS ha chiuso il problema. Durante l'impostazione della riproduzione del problema, ho iniziato il test con database di nuova creazione in un'istanza sia 2008R2 che 2012. Entrambi i database sembrano funzionare normalmente sotto tutti gli altri aspetti.
Glenn Estrada,

3
Con i passaggi di riproduzione per il problema, segnalalo su Connect in modo che possano risolverlo!
Jon Seigel,

Hai modificato il livello di compatibilità del DB dopo l'aggiornamento? Non utilizzo il rilevamento delle modifiche, ma penso a una mancata corrispondenza della versione dopo l'aggiornamento.
Guillaume R.,

Risposte:


3

Non si usa min_valid_version per tenere traccia delle modifiche. Viene utilizzato solo per convalidare se il client deve essere reinizializzato, se i metadati sono stati ripuliti prima che il client potesse utilizzare le modifiche.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Ottiene la versione minima valida per l'uso per ottenere informazioni sul rilevamento delle modifiche dalla tabella specificata quando si utilizza la CHANGETABLEfunzione.

Min_valid_version cambia con la versione di cleanup e non dipende dalle modifiche alla tabella utente. Ogni volta che viene eseguito il thread di pulizia potrebbe esserci un aggiornamento a min_valid_version indipendentemente dalle modifiche ai dati.

Prima del 2012, min_valid_version era contrassegnato come la versione di pulizia, quando in realtà dovrebbe essere una versione in più rispetto alla versione di pulizia poiché i metadati per quella versione sono già stati ripuliti. Nel 2012 è quello che hanno cambiato per assicurarsi di aggiornare la min_valid_version corretta.

Non si dovrebbe tenere traccia delle modifiche usando min_valid_version, invece si dovrebbe salvare last_sync_version dopo ogni sincronizzazione e chiamare il CHANGETABLEper enumerare le modifiche dopo l'ultima versione di sincronizzazione.

In base alla progettazione: la versione minima valida cambia con la versione di pulizia e non dipende dalle modifiche alla tabella utente. Ogni volta che viene eseguito il thread di pulizia potrebbe esserci un aggiornamento alla versione minima valida indipendentemente dalle modifiche ai dati.

Risolvi: modifica la procedura per utilizzare "current_version" anziché "min_valid_version"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.