更改跟踪和数据还原

对于需要同步的应用程序,必须考虑启用了更改跟踪的数据库恢复到早期版本数据的情况。如果发生故障转移到异步数据库镜像的情况,或者如果在使用日志传送时出现故障,则数据库从备份还原之后就会发生这种情况。以下情况揭示了这一问题:

  1. 表 T1 启用了更改跟踪,并且该表的最低有效版本为 50。

  2. 客户端应用程序在版本 100 处同步数据,并获取有关版本 50 到 100 之间的所有更改的信息。

  3. 在版本 100 之后又对表 T1 进行了其他更改。

  4. 在版本 120 处出现故障,数据库管理员还原了数据库,但出现了数据丢失。在还原操作之后,该表包含直至版本 70 的数据,最低同步版本仍为 50。

    也就是说,同步数据存储区具有主数据存储区中已不再存在的数据。

  5. T1 更新了许多次。当前版本为 130。

  6. 客户端应用程序再次进行同步并提供上次同步版本号 100。客户端会验证此版本号有效,因为 100 大于 50。

    客户端获取版本 100 到 130 之间的更改。此时,客户端并不知道版本 70 到 100 之间的更改已经与以前不同。客户端上的数据与服务器上的数据不同步。

请注意,如果将数据库恢复到版本 100 之后的某一版本,则同步不会出现问题。客户端和服务器将在下一个同步间隔内正确同步数据。

更改跟踪不支持恢复丢失的数据。但是,有两种选择可用于检测这些类型的同步问题:

  • 在服务器上存储数据库版本 ID,每次恢复数据库或丢失数据时都更新此值。每个客户端应用程序将存储该 ID,并且每个客户端在同步数据时必须验证此 ID。如果发生数据丢失,则 ID 将不匹配,并且客户端将重新初始化。这种方法有一个缺点,即如果数据丢失未越过上次的同步边界,则客户端可能会进行不必要的重新初始化。

  • 当客户端查询更改时,会在服务器上为每个客户端记录上次同步的版本号。如果数据有问题,则上次同步的版本号将不匹配。这表明需要进行重新初始化。