¿Las partes internas de Change Tracking cambiaron de SQL Server 2008 a 2012?


9

En problemas para solucionar un problema con la sincronización de dispositivos desconectados con un servidor de base de datos central, estamos experimentando un problema después de actualizar a SQL Server 2012 en el servidor. Parece que CHANGE_TRACKING_MIN_VALID_VERSION está devolviendo un valor 1 más alto de lo que debería (o al menos de lo que lo hizo antes de la actualización).

He estado trabajando a través del gran paseo de Arshad Ali a través de ejemplos de cómo configurar un ejemplo simple.

He ejecutado los scripts del # 1 al # 5 para insertar, eliminar y actualizar una fila en la tabla de empleados en un entorno SQL Server 2008 y 2012.

En 2008, la siguiente declaración devuelve un 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))

En 2012, devuelve un 1.

Al trabajar con algunos scripts más (6-8) en las pruebas, configuré el período de retención en 1 minuto para poder forzar una acción de limpieza. Me fui por el día y aparentemente funcionó durante la noche.

En la instancia de 2008, CHANGE_TRACKING_CURRENT_VERSION y CHANGE_TRACKING_MIN_VALID_VERSION son iguales (11). En la instancia de 2012, CHANGE_TRACKING_MIN_VALID_VERSION es uno más alto (12) que CHANGE_TRACKING_CURRENT_VERSION (11). Esto podría tener un impacto en el proceso de sincronización cuando una base de datos está inactiva durante largos períodos de tiempo. Y hemos descubierto que el proceso podría quedar atrapado en un bucle, especialmente cuando se realiza la siguiente prueba para determinar si se requiere una reinicialización, a diferencia de la sincronización:

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

¿Alguien más ha experimentado este cambio de comportamiento? ¿Alguien tiene una explicación?


2
Hay un elemento de Microsoft Connect para este problema, connect.microsoft.com/SQLServer/feedback/details/770014/… básicamente Microsoft cree que el problema podría estar relacionado con la corrupción en la base de datos en cuestión. ¿Puedes reproducir esta situación en una base de datos recién creada?
Max Vernon

1
Max, revisé el artículo de Connect. Desafortunadamente, el póster original parece haber abandonado la discusión y MS cerró el tema. Al configurar la reproducción del problema, comencé las pruebas con bases de datos recién creadas en una instancia de 2008R2 y 2012. Ambas bases de datos parecen funcionar normalmente en todos los demás aspectos.
Glenn Estrada

3
Con los pasos de repro para el problema, infórmelo en Connect para que puedan solucionarlo.
Jon Seigel

¿Cambió el nivel de compatibilidad de la base de datos después de la actualización? No utilizo el seguimiento de cambios, pero pienso en una discrepancia de versión después de la actualización.
Guillaume R.

Respuestas:


3

Uno no usa min_valid_version para rastrear los cambios. Esto solo se usa para validar si su cliente tiene que reinicializarse, si los metadatos se han limpiado antes de que el cliente pueda consumir los cambios.

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

Obtiene la versión mínima que es válida para usar en la obtención de información de seguimiento de cambios de la tabla especificada cuando está utilizando la CHANGETABLEfunción.

Min_valid_version cambia con la versión de limpieza y no depende de los cambios en la tabla de usuario. Cada vez que se ejecuta el subproceso de limpieza, podría haber una actualización de min_valid_version independientemente de los cambios en los datos.

Antes de 2012, min_valid_version se marcaba igual que la versión de limpieza, cuando en realidad debería ser una más que la versión de limpieza, ya que los metadatos para esa versión ya se han limpiado. En 2012, eso es lo que cambiaron para asegurarse de que actualizan la versión correcta min_valid_version.

No se debe rastrear el cambio usando min_valid_version, sino guardar la última_sincronización_versión después de cada sincronización y llamar al CHANGETABLEpara enumerar los cambios después de la última versión de sincronización.

Por diseño: la versión mínima válida cambia con la versión de limpieza y no depende de los cambios en la tabla de usuario. Cada vez que se ejecuta el subproceso de limpieza, puede haber una actualización de la versión mínima válida, independientemente de los cambios en los datos.

Resolver: cambie el procedimiento para usar 'current_version' en lugar de 'min_valid_version'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.