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.