代码之家  ›  专栏  ›  技术社区  ›  Timur Zanagar

如何实现快速的数据库同步。使用只读源?

  •  1
  • Timur Zanagar  · 技术社区  · 15 年前

    我有一个源数据库(Sybase),它是只读的,您可以使用导入文件写入数据库。另一方面是我自己的数据库(MSSQL),它没有任何限制。

    主要问题是第一个数据库没有时间戳,我没有任何权限更改源数据库。有没有一个引擎/解决方案来实现这个同步?完成?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Lasse V. Karlsen    15 年前

    diff算法可能会工作,但不会很快,从某种意义上说,您必须扫描整个源数据库进行每次同步。

    基本上,您将以一种约定的、稳定的方式进行完整的数据提取(即,两个这样的提取之间没有任何变化将产生相同的输出)。

    然后将其与之前的提取进行比较,然后可以找到所有更改。需要一些比纯文本diff更智能的东西来帮助确定行不仅被删除+插入,而且实际上是被更新的。

    不幸的是,如果没有办法问源数据库最新的更改是什么,通过,如您所指出的,缺乏时间戳,或类似的机制,那么我看不到您每次都能得到比完全提取更好的结果。

    现在,我对Sybase了解不多,但是在MS SQL Server中,您可以创建另一个镜像第一个数据库,在第二个数据库中,您可以进行所需的任何更改。

    但是,如果您可以在Sybase中创建这样一个数据库,并同时使用SQL访问这两个数据库,那么您可能能够运行产生差异的查询。

    例如,沿着以下几条线:

    SELECT S.*
    FROM sourcedb..sourcetable1 AS S
        FULL JOIN clonedb..sourcetable1 AS C
        ON S.pkvalue = C.pkvalue
    WHERE S.pkvalue IS NULL OR C.pkvalue IS NULL
    

    这将生成插入或删除的行。

    要查找那些已更改的内容,您需要以下WHERE子句:

    WHERE S.column1 <> C.column1
       OR S.column2 <> C.column2
       OR ....
    

    因为表是联接的,所以WHERE子句将筛选出先前提取和当前状态不同的任何行。

    现在,这可能也不会运行得很快,您必须进行测试以确保。