在应用中有时需要将一个系统的数据定时复制到另一个系统, 最好的情况是能增量复制, 即每次只复制新增或变更过的数据, 以减小网络流量和提高复制效率, 尤其在数据量达到百万级或千万级时。但很多系统没有时间戳字段或其他字段用来标识数据内容是新增或被修改过,因此在复制时无法只提取增量部分,而是全部数据都全部复制一遍,极度费时。而且这种系统通常还不容许在原有数据表中添加新字段来做标记。 下面给出几种辅助方法来实现增量复制。

方法1:

在源头数据库中添加辅助表,在业务表中增加一个触发器,触发器将业务表中新增和变更信息记录到辅助表中。在复制时从辅助表中获得新增或变更记录,然后再从业务表中将这些记录复制出来,成功后从辅助表中删除已复制过的记录, 使辅助表记录尽可能少,减少触发器对业务的性能影响。

 

方法2:

如果源头数据库中不容许添加触发器或表,则所有数据都要复制到一个文本文件中,并且一条记录一行,如果数据只有新增,并且可以通过流水号或时间字段排序将新增的记录都放在文件的后面,则可以记录下前一次复制的记录数,对新的复制操作,只要跳过前次已复制过的记录数,将之后的记录复制到目标库也就实现了增量复制。

 

方法3:

如果新增记录不能排在文件后部或包含修改记录, 要比较出两次复制之间记录的不同, 可以通过计算每一条记录的Hash摘要来判断,如果记录内容变化过,则算出来的Hash摘要会不同。 具体步骤如下:

(1)计算出本次复制的每条记录的Hash摘要,放入一个集合,并记录摘要值和记录的对应关系。计算出上次复制的每条记录的Hash摘要(或从磁盘上直接获得上次计算后保存的值),放入一个集合,并对这些摘要值进行排序,排序的目的是为使用二分查找提高查找效率,尤其当数据量达到百万计以上时。

(2)从本次摘要的集合中找出不包含在上次摘要集合中的值,则这些值对应的记录就是新增或修改过需要复制的增量记录。

 

以上方法提供了辅助的增量复制解决方案。不过最好还是在数据设计时增加字段记录下变更和新增信息,这是成本最低也最容易实现增量复制方法。