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?
fuente
Respuestas:
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
CHANGETABLE
funció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
CHANGETABLE
para 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'
fuente