我可以设置过滤的星型数据库复制吗?

时间:2009-11-13 20:12:37

标签: mysql database replication rdbms database-replication

我们有一个客户端需要设置N个本地数据库,每个数据库包含一个站点的数据,然后拥有一个包含所有N个数据库的联合的主企业数据库。需要将单个站点数据库中的更改传播到主数据库,并且需要将主数据库中的更改传播到相应的单个站点数据库。

我们一直在为需要同时保持最新的两个数据库的客户端使用MySQL复制。这是双向复制。如果我们在这里尝试完全相同的方法,我们最终将使用与主数据库等效的所有N个本地数据库,这不是我们想要的。每个站点不仅不能从其他站点看到数据,而是从主站发送N次数而不​​是一次,这可能是一个巨大的浪费。

使用MySQL实现这种新星形模式有哪些选择?我知道我们只能复制某些表,但有没有办法按记录过滤复制?

是否有任何工具可以帮助或竞争更好的RDBMS?

8 个答案:

答案 0 :(得分:3)

SymmetricDS可以为此工作。它是基于Web的,与数据库无关的数据同步/复制软件。它使用Web和数据库技术近乎实时地在关系数据库之间复制表。该软件旨在扩展到大量数据库,在低带宽连接上工作,并能够承受网络中断的时间。

我们已经使用它将1000多个MySQL零售商店数据库同步到Oracle公司数据库。

答案 1 :(得分:2)

我以前做过这个,而AFAIK这是最简单的方法。您应该查看使用Microsoft SQL Server合并复制和使用行过滤。您的行过滤将被设置为具有一个列,该列指出它应该到达的单个站点目的地。

例如,您的表格可能如下所示:

ID_column | column2 |目的地

列中的数据可能如下所示: 12345 | '数据'| 'SITE1'

然后,您可以将合并复制“subscriber”site1设置为对“目标”列和值“site1”进行过滤。

本文可能会有所帮助:

Filtering Published Data for Merge Replication 还有一篇关于msdn的文章称为“增强合并复制性能”,这可能会有所帮助 - 您还需要了解在SQL Server合并复制中设置发布者和订阅者的基础知识。

祝你好运!

答案 2 :(得分:1)

简短回答不,你应该重新设计。

长期回答是的,但它非常疯狂,设置和管理将是一个真正的痛苦。

一种方法是将主数据库在站点之间的复制进行循环。使用脚本从站点记录复制30秒,然后再到达下一个站点。您可能希望查看replicate-do-db and friends以限制复制的内容。

我不确定的另一个选项是在主办公室中有N个mysql从每个站点办公室复制,然后使用federated storage engine从主数据库提供一个公共视图到每个站点的奴隶。站点从站可以从主数据库中复制并获取所需的任何更改。

答案 3 :(得分:1)

如果您需要单向复制,则使用在星形中心复制的多个数据库副本和自定义“桥接”应用程序将数据进一步移动到最终的

答案 4 :(得分:1)

只是一个随机指针:Oracle lite支持这一点。我已经为类似的任务评估了一次,但它需要在所有客户端安装一些不可选的东西。 可以找到粗略的架构概述here

答案 5 :(得分:1)

值得一看的是mysql-table-sync from maatkit,可让您使用可选的 - where 子句同步表格。

答案 6 :(得分:0)

听起来你需要一些专家帮助 - 我可能不是。

这种复制需要“实时”吗? 某种ETL过程(或过程)可能是一种选择。我们在内部使用MS SSIS和Oracle; SSIS似乎对ETL类型的工作相当不错(但是我没有针对那个特定的煤炭工作,所以我真的不能说)。

数据的易变性如何?您是否认为数据主要是运营/交易? 您在谈论什么样的数据量?

中央主站是否也用作其所在办公室的本地数据库?如果它是你可能想要改变它 - 总部工作就像一个远程办公室 - 这样你可以对待所有办公室相同;如果不同的网站被区别对待,你会经常遇到问题/异常。

答案 7 :(得分:0)

听起来你可以通过走出直接数据库结构来获得更好的服务。

我没有给你详细的答案,但这是我要做的高级别的事情:

我会从每个数据库中选择一个过去的变化列表(合理的时间范围),构建插入和删除语句,这些语句将统一“大”数据库中的所有数据,然后分离较小的插入集和删除每个特定数据库的语句。

然后我会运行这些。

如果数据进出有任何重叠,则此设置可能存在“合并”问题。

由于您的时间框架构造不正确,还存在数据丢失或重复的问题。