同一MySQL表的双向复制

时间:2013-04-01 15:24:34

标签: mysql replication

AppA存储/检索来自dbA.tableA的数据。 AppB存储/检索来自dbB.tableA的数据。 tableA定义在这些数据库中是相同的。首先从dbB.tableA复制dbA.tableA(假设两行都有5行)。

row6由AppA创建(比如主键6)row7由AppB创建(比如主键7)。我希望将row7复制到dbA.tableA,将row6复制到dbB.tableA

  1. 这甚至可以设置双向复制,以便AppA,AppB可以在任何时间点查看相同的数据。

  2. 如果主键是自动增量,是否可以保持数据的完整性,或者主键上是否存在冲突。

4 个答案:

答案 0 :(得分:5)

是的,mysql中支持master-master复制,所以你可以做你想做的事。

您希望dbA和dbB具有不同的auto_increment_offsets,并将auto_increment_increment设置为大于默认值1。参见

http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html

总之,您将了解到您希望添加到各自的my.cnf文件中:

DBA:

[mysqld]
server-id = 1
auto_increment_increment = 10
auto_increment_offset = 1

DBB:

[mysqld]
server-id = 2
auto_increment_increment = 10
auto_increment_offset = 2

然后当服务器A插入值时,它将使用1,1,11,31等值作为它的主键值。服务器B将使用2,12,22,32等。这样他们永远不会冲突

显然,您可以为auto_increment_increment使用较低的值,例如2,但是根据您希望以后增长群集的方式,您可能希望为自己留出一些空间。

答案 1 :(得分:1)

这个答案假设您在同一个mysqld上运行两个数据库/模式。如果您在不同的mysqld上运行,请参阅Hexist的答案

当然有可能发生冲突:谁说在dbA中没有创建id 7而在复制发生之前,在dbB中创建了另一个id 7?特别是使用自动增量时

你可以尝试一些事情,其中​​包括:

  • 如果您的id是有符号的int,则最大值为2147483647.在dbB中尝试将初始自动增量设置为1073741824(将其设置为最大值的一半)。这样,在dbB中创建的所有ID都位于更高的id区域,并且碰撞的可能性更小。
  • 尝试guid而不是自动增量ID(How should I store GUID in MySQL tables?

如果dbA和dbB都在同一个mysql服务器上,你可以通过按计划运行这些查询或使用触发器(插入时)来实现“复制”

Insert into dbA.tableA values (select b.* from dbB.tableA b left join dbA.tableA a on b.id = a.id where a.id is null)
Insert into dbB.tableA values (select a.* from dbA.tableA a left join dbB.tableA b on a.id = b.id where b.id is null)

修改:抱歉,您无法使用自动增量功能。自动增量将始终基于已存在的最高ID。所以你不能强迫1台机器上的自动增量在它获得更高的id之后保持低位。

答案 2 :(得分:1)

我建议将商店/检索控件提供给AppC,它可以同时访问dbAdbB。 AppC也会创建主键。

答案 3 :(得分:0)

假设您在同一个mysqld实例上运行两个数据库,我将添加穷人的复制

create view dbB.tableA as select * from dbA.tableA;

本身就是MySQL的穷人的同义词,但它在实践中非常有效,包括插入,更新和删除操作。

基本上它意味着取消两个副本中的一个并将其替换为另一个副本的同义词。这是否符合您的需求,只有您可以告诉。