备份和还原数据库
与任何生产数据库一样,同步操作涉及的数据库也应定期备份。如果必须从备份还原数据库,需要考虑两个主要事项:
数据库中在还原之后所做的变更可能不会传播到客户端或其他对等方。这是由于从数据库中选择变更时使用的 timestamp 值造成的。
例如,在客户端与服务器同步期间,Sync Framework 从服务器数据库检索一个新定位点值,并将其存储在客户端数据库上。此值用作要同步的当前变更集的上限。有关更多信息,请参见跟踪服务器数据库中的变更。在还原服务器数据库后,存储在客户端数据库中的值在逻辑上可能位于由服务器数据库返回的值之前。
对于仅限上载同步和双向同步应用情景,客户端或其他对等方可能包含新还原的数据库所没有的变更。
本主题中的示例以客户端和服务器同步为例。相似的原理适用于对等同步,并且描述对等注意事项。服务器数据库是远程对等方。客户端数据库是本地对等方。有关备份和还原通过使用 SqlSyncProvider 同步的 SQL Server 数据库的信息,请参见如何备份和还原数据库 (SQL Server)。
服务器数据库
为了了解客户端数据库如何在逻辑上可能位于服务器数据库之前,请看是如何在 Sync Framework 示例数据库的 Sales.Customer 表中跟踪更新的。UpdateTimestamp 列存储 timestamp 值,而新的定位点命令从 SQL Server MIN_ACTIVE_ROWVERSION 函数返回一个值。为了清楚起见,示例中使用了整数而不是十六进制值。
在还原数据库前,MIN_ACTIVE_ROWVERSION 返回值 31。此值作为最后收到的定位点存储在客户端数据库中。
在还原数据库后,MIN_ACTIVE_ROWVERSION 返回值 19。
将执行更新,以便 UpdateTimestamp 列中的 timestamp 值达到 32。
同步发生,并且 MIN_ACTIVE_ROWVERSION 返回值 32。将下载对 Sales.Customer 的最终更新,因为 32 大于上一次收到的定位点值 31。不会将 19 和 31 之间的更新识别为变更。
任何使用逻辑时钟(如时间戳)的跟踪方案都容易受到无法识别的变更这一问题的影响。使用基于日期和时间的数据类型的跟踪方案不易受到此类问题的影响,因为“挂钟”**的向前运动与数据库的状态无关。在对等同步中,需要将时间戳用于变更跟踪。
若要解决时间戳带来的问题,请使用以下方法之一:
将服务器的时间戳设置为执行还原操作之前的时间点。在前面的示例中,可以对单个表执行虚更新,直至 MIN_ACTIVE_ROWVERSION 返回 31。
这是推荐用于对等同步的方法。
在服务器上存储每个客户端的定位点。在前面的示例中,从备份中得到的上一次收到的定位点应该是 19。因此,能够识别后续更新,而且会下载介于 19 和 32 之间的所有变更。Sync Framework 没有提供对于此操作的内置支持,但是可以在服务器上以如下方式创建一个系统:
在服务器数据库中创建一个表,每一个客户端均对应于表中的一行。表中有一列包含 Sync Framework 为每个客户端生成的 ID,另外还有一列包含每个客户端的定位点。在同步期间,应用程序将用新定位点值更新此列。
更改同步命令以选择与所同步的客户端对应的最低的定位点值。此值可以是存储在客户端数据库中的值,或者是存储在服务器数据库中的值。在进行数据库还原操作后,服务器数据库中的值应该较低。如果在将某个值写入服务器表之后但在将变更应用于客户端之前发生故障,客户端数据库中的值应该较低。如果同步按照预期方式进行,则这些值应该相等。编写的插入命令可能如下所示:
SELECT CustomerId, CustomerName, SalesPerson, CustomerType FROM Sales.Customer WHERE (InsertTimestamp > (SELECT AnchorValue from ServerAnchorTable WHERE ClientId = @sync_client_id) OR InsertTimestamp > @sync_last_received_anchor) AND InsertTimestamp <= @sync_new_received_anchor AND InsertId <> @sync_client_id
客户端数据库
在服务器数据库在同步元数据方面还原到目前时间点之后,数据库仍然会丢失自制作服务器备份以来在客户端上进行的变更。若要客户端做出适当的响应,客户端必须知道已将服务库数据库还原。可以使用服务器端跟踪表指示自从上次特定客户端同步后是否已进行了还原。在每次同步会话期间,客户端应用程序会先检查此表以确定其是可以正常同步还是应执行特殊代码来处理已还原的数据库。
在客户端应用程序识别出服务器数据库已被还原后,应用程序可以使客户端数据库和服务器数据库一致。有多种方法可完成该操作,包括以下方法:
通过删除所有表然后与服务器同步,重新初始化客户端数据库。这是最简单的方法,但是在客户端所做的所有变更都会丢失。
重新初始化是推荐用于对等同步的方法。有关初始化对等数据库的信息,请参见如何配置和执行协作同步(非 SQL Server)中的“初始化服务器数据库”。
在创建客户端表的副本之后重新初始化客户端数据库。应用程序可以使用以下步骤:
确定服务器数据库是否已还原。
制作客户端数据库中所有表的副本,然后删除原始表。
与服务器同步以下载新架构和数据。
将新表中的行与制作的副本进行比较。
标识两组表之间的差异,并将所需的所有变更应用到新表。
再次同步以上载应用到新表的变更。