3

我有 2 个异构数据库。一个在mysql,一个在ms sql。

我想让它们保持同步。

会有周期性的数据流,信息流是双向的

有人有任何策略/方法吗?

4

4 回答 4

2

假设您不打算使用某种形式的现成解决方案,那么您有几个选项可供您选择。基本上,您要做的是找到一种方法来捕获在一个数据库中所做的更改并将它们复制到另一个数据库中。

完整提取和增量
对要同步的表中的每一行进行完整的、按键排序的转储,并将其逐行与上次运行的同步的转储进行比较。对输出进行排序可以使比较过程更快,因为您可以确定一行是否已更改、删除或删除,而无需

  • 优点:保证捕获所有更改。
  • 优点:易于实施。
  • 缺点:慢。
  • 缺点:运行时会在数据库上产生大量负载。

此选项对于中小型数据库应该是非常可行的。

事务日志
分析数据库中的事务日志以找出更改的内容,并将这些更改应用到其他数据库。

  • 优点:更快,因为它不需要从数据库中读取所有内容
  • 优点:实现起来仍然相对简单
  • 缺点: DBA 有时必须清除日志才能解决生产问题。这可能会导致未同步的丢失更改。

如果您可以依靠可用的日志,这可能是一个好主意。

触发器
使用触发器记录更改,并将它们复制到另一个数据库。

  • 优点:快,因为它只捕捉变化。
  • 缺点:增加每笔交易的开销

应用程序中的同步
只需确保应用程序写入两个数据库即可。

  • 优点:数据库没有真正的开销。
  • 缺点:不可靠。只需要一个人忘记写入两个数据库即可。

如果应用程序仅通过几个受控模块写入数据库(即没有太多地方可以忘记更新两个数据库),则可以使这工作。在管理较少的设置中(即多个应用程序/不受控制或因素不佳的数据库访问/临时脚本),这根本不是一个选项。

于 2009-12-13T11:32:53.007 回答
0

Anand, you can find this in Google.

sync mysql and mssql

I've not used this software, but they offer a free trial

于 2009-12-13T11:02:04.730 回答
0

看看synchrodb.com

SynchroDB比较两个数据库的内容,根据参数和源数据库的内容更新目标数据库的内容。

SynchroDB 使用功能键的概念来匹配源数据库和目标数据库中的行。

SynchroDB 是高度可定制的。默认行为是:

•在目标数据库中插入它不包含的行。

•对于同时属于两个数据库的行,逐一比较它们的字段,并在目标数据库中更新不同的字段。

• 从目标数据库中删除源数据库中不存在的行。

SynchroDB 是免费的。

于 2012-07-10T13:33:18.810 回答
0

首先需要更多信息:

  • 你能承受多少同步延迟?5秒?5个小时?15小时?等等
  • 数据库之间有多少转换?可以在视图中处理的任何内容或微不足道的更改,还是更实质性的更改?
  • 数据量是什么样的?表有多大,每天有多少数据变化,数据是否分区?
  • 并发要求是什么?您可以关闭用户访问几分钟吗?
  • 双向更改会发生在同一张表还是不同的表上?
  • 数据质量要求是什么?如果两个不同的事务,每个事务在同一个表中的同一行但在不同的数据库中几乎同时更新 - 并且一个步骤在另一个步骤上,是否可以?
  • 什么是粒度?您是否需要在某个时间点复制发生的每个事务或仅复制当前快照(即使该时间点是每 5 分钟一次)?

一般来说,如果您需要实时同步,那么您最终会得到一个复制解决方案。这通常可以处理非常少量的转换(通常通过存储过程发生)。它通常是嗅探日志的商业解决方案。由于大多数人不希望代码依赖于日志格式,因此他们几乎总是使用打包的解决方案。

如果您不需要实时同步、拥有大量数据或有重要的转换要求,那么您最终会得到 ETL 解决方案。有很多可供选择,但它们大多是商业的。另一方面,如果您花时间了解最佳实践,他们并不难培养自己。奇怪的是,真的很少谈论。无论如何,Adam Luchjenbroers 在识别大多数 ETL 方法方面做得很好。如果你能负担得起快照之间的事务松动,我推荐使用文件增量方法——因为否则它是最准确的方法,因为所有其他方法都依赖于时间戳、触发器或日志,它们不会捕获所有更改。

于 2009-12-14T14:34:17.277 回答