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


9

在解决与断开连接的设备与中央数据库服务器同步的问题时,在服务器上升级到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'))

在2012年,它返回1。

在测试中通过其他几个脚本(6-8)工作时,我将保留期设置为1分钟,以期希望执行清除操作。我离开了一天,显然它跑了一整夜。

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

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

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


2
此问题有一个Microsoft Connect项目connect.microsoft.com/SQLServer/feedback/details/770014/…基本上,Microsoft认为该问题可能与相关数据库的损坏有关。您可以在新创建的数据库中重现这种情况吗?
Max Vernon

1
麦克斯,我确实阅读了“连接”文章。不幸的是,原始发布者似乎已放弃讨论,而MS结束了该问题。在设置问题的再现时,我使用2008R2和2012实例中的新创建的数据库开始了测试。这两个数据库似乎在所有其他方面均正常运行。
2013年

3
有关此问题的修复步骤,请在Connect上报告,以便他们解决!
乔恩·塞格尔

升级后,您是否更改了数据库的兼容性级别?我不使用更改跟踪,但考虑升级后版本不匹配。
Guillaume R.

Answers:


3

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

CHANGE_TRACKING_MIN_VALID_VERSION(Transact-SQL)

获取使用该CHANGETABLE功能时可用于从指定表中获取更改跟踪信息的最低版本。

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

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

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

通过设计-最小有效版本随清除版本而更改,并且不依赖于对用户表的更改。每次运行清理线程时,无论数据更改如何,都可能将其更新为最低有效版本。

解决-将过程更改为使用“ current_version”而不是“ min_valid_version”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.