Haben sich die Interna für die Änderungsverfolgung von SQL Server 2008 auf 2012 geändert?

9

Bei der Fehlerbehebung bei einem Problem mit der Synchronisierung nicht verbundener Geräte mit einem zentralen Datenbankserver tritt nach dem Upgrade auf SQL Server 2012 auf dem Server ein Problem auf. Es scheint, dass CHANGE_TRACKING_MIN_VALID_VERSION einen Wert 1 zurückgibt, der höher ist als er sollte (oder zumindest als vor dem Upgrade).

Ich habe Arshad Alis großartigen Spaziergang durch ein Beispiel für die Erstellung eines einfachen Beispiels durchgearbeitet .

Ich habe die Skripte von Nr. 1 bis Nr. 5 ausgeführt, um eine Zeile in der Employee-Tabelle sowohl in einer SQL Server 2008- als auch in einer 2012-Umgebung einzufügen, zu löschen und zu aktualisieren.

Im Jahr 2008 gibt die folgende Anweisung eine 0 zurück:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

Im Jahr 2012 gibt es eine 1 zurück.

Beim Durcharbeiten einiger weiterer Skripte (6-8) in den Tests habe ich die Aufbewahrungsdauer auf 1 Minute festgelegt, um hoffentlich eine Bereinigungsaktion zu erzwingen. Ich ging für den Tag und anscheinend lief es über Nacht.

In der Instanz von 2008 sind CHANGE_TRACKING_CURRENT_VERSION und CHANGE_TRACKING_MIN_VALID_VERSION gleich (11). In der 2012-Instanz ist CHANGE_TRACKING_MIN_VALID_VERSION um eins höher (12) als CHANGE_TRACKING_CURRENT_VERSION (11). Dies kann sich auf den Synchronisierungsprozess auswirken, wenn eine Datenbank längere Zeit inaktiv ist. Und wir haben festgestellt, dass der Prozess in eine Schleife geraten kann, insbesondere wenn der folgende Test durchgeführt wird, um festzustellen, ob eine Neuinitialisierung im Gegensatz zur Synchronisierung erforderlich ist:

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

Hat jemand diese Verhaltensänderung erlebt? Hat jemand eine Erklärung?

Glenn Estrada
quelle
2
Für dieses Problem gibt es ein Microsoft Connect-Element: connect.microsoft.com/SQLServer/feedback/details/770014/… Grundsätzlich ist Microsoft der Ansicht, dass das Problem möglicherweise mit einer Beschädigung der betreffenden Datenbank zusammenhängt. Können Sie diese Situation in einer neu erstellten Datenbank wiederholen?
Max Vernon
1
Max, ich habe den Connect-Artikel gelesen. Leider scheint das Originalplakat die Diskussion abgebrochen zu haben und MS hat das Thema geschlossen. Beim Einrichten der Reproduktion des Problems habe ich mit dem Testen mit neu erstellten Datenbanken sowohl in einer 2008R2- als auch in einer 2012-Instanz begonnen. Beide Datenbanken scheinen in allen anderen Aspekten normal zu funktionieren.
Glenn Estrada
3
Melden Sie die Repro-Schritte für das Problem bei Connect, damit sie es beheben können!
Jon Seigel
Haben Sie die Kompatibilitätsstufe der Datenbank nach dem Upgrade geändert? Ich verwende keine Änderungsverfolgung, denke aber nach dem Upgrade an eine Versionsinkongruenz.
Guillaume R.

Antworten:

3

Die min_valid_version wird nicht verwendet, um die Änderungen zu verfolgen. Dies wird nur verwendet, um zu überprüfen, ob Ihr Client neu initialisiert werden muss, wenn die Metadaten bereinigt wurden, bevor der Client die Änderungen übernehmen konnte.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Ruft die Mindestversion ab, die zum Abrufen von Änderungsverfolgungsinformationen aus der angegebenen Tabelle gültig ist, wenn Sie die CHANGETABLEFunktion verwenden.

Min_valid_version ändert sich mit der Bereinigungsversion und hängt nicht von den Änderungen an der Benutzertabelle ab. Jedes Mal, wenn ein Bereinigungsthread ausgeführt wird, kann es unabhängig von Datenänderungen zu einer Aktualisierung von min_valid_version kommen.

Vor 2012 wurde min_valid_version als Bereinigungsversion markiert, obwohl es tatsächlich eine mehr als die Bereinigungsversion sein sollte, da die Metadaten für diese Version bereits bereinigt wurden. 2012 haben sie dies geändert, um sicherzustellen, dass sie die richtige min_valid_version aktualisieren.

Man sollte Änderungen nicht mit min_valid_version verfolgen, sondern die last_sync_version nach jeder Synchronisierung speichern und die aufrufen, CHANGETABLEum die Änderungen nach der letzten Synchronisierungsversion aufzulisten .

Von Entwurf - Min. Gültige Versionsänderungen mit der Bereinigungsversion und hängen nicht von den Änderungen an der Benutzertabelle ab. Jedes Mal, wenn ein Bereinigungsthread ausgeführt wird, kann es unabhängig von Datenänderungen zu einer Aktualisierung auf die gültige Mindestversion kommen.

Auflösen - Ändern Sie die Prozedur so, dass 'current_version' anstelle von 'min_valid_version' verwendet wird.

Stacylaray
quelle