更改跟踪内部结构是否从 SQL Server 2008 更改为 2012?

Gle*_*ada 9 sql-server sql-server-2012 change-tracking

在解决将断开连接的设备与中央数据库服务器同步的问题时,我们在服务器上升级到 SQL Server 2012 后遇到了问题。看起来 CHANGE_TRACKING_MIN_VALID_VERSION 返回的值比它应有的值高 1(或至少比升级前的值高)。

我一直在研究如何设置简单示例的Arshad Ali 的精彩示例。

我已经运行了从 #1 到 #5 的脚本,以在 SQL Server 2008 和 2012 环境中的 Employee 表中插入、删除和更新一行。

在 2008 年,以下语句返回 0:

SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee'))
Run Code Online (Sandbox Code Playgroud)

在 2012 年,它返回 1。

在测试中通过更多脚本 (6-8) 工作时,我将保留期设置为 1 分钟,以期强制执行清理操作。我离开了一天,显然它运行了一夜。

在 2008 年的实例中,CHANGE_TRACKING_CURRENT_VERSION 和 CHANGE_TRACKING_MIN_VALID_VERSION 是相等的 (11)。在 2012 年的实例中,CHANGE_TRACKING_MIN_VALID_VERSION 比 CHANGE_TRACKING_CURRENT_VERSION (11) 高一 (12)。当数据库长时间空闲时,这可能会对同步过程产生影响。我们发现进程可能会陷入循环,尤其是在执行以下测试以确定是否需要重新初始化而不是同步时:

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''...
Run Code Online (Sandbox Code Playgroud)

有没有其他人经历过这种行为变化?有人有解释吗?

sta*_*ray 3

不使用 min_valid_version 来跟踪更改。这仅用于验证您的客户端是否必须重新初始化,以及元数据是否在客户端可以使用更改之前已被清除。

\n\n

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)

\n\n

获取在使用该CHANGETABLE函数时从指定表获取更改跟踪信息时有效的最低版本。

\n\n

Min_valid_version 随清理版本而变化,并且不依赖于用户表的更改。每次运行清理线程时,无论数据如何更改,min_valid_version 都可能会更新。

\n\n

在 2012 年之前,min_valid_version 被标记为与清理版本相同,但实际上它应该比清理版本大 1,因为该版本的元数据已被清理。2012 年,他们进行了更改,以确保更新正确的 min_valid_version。

\n\n

不应使用 min_valid_version 跟踪更改,而应在每次同步后保存 last_sync_version 并调用 来枚举CHANGETABLE上次同步版本后的更改。

\n\n

根据设计 - 最小有效版本随清理版本而更改,并且 \xe2\x80\x99t 不依赖于对用户表的更改。每次运行清理线程时,无论数据如何更改,都可能会更新到最小有效版本。

\n\n

解决 - 更改程序以使用“current_version”而不是“min_valid_version”

\n