7

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

row6由 AppA 创建(例如主键 6)row7由 AppB 创建(例如主键 7)。我想row7被复制到dbA.tableArow6dbB.tableA

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

  2. 如果主键是自增的,是否有可能保持数据的完整性,或者是否有可能在主键上发生冲突。

4

4 回答 4

6

是的,主-主复制在 mysql 中得到了很好的支持,所以你可以做你想做的事。

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

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

总之,您将了解到您需要添加到各自的 my.cnf 文件中,例如:

分贝:

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

分贝:

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

那么当服务器 A 插入值时,它将使用 1、11、21、31 之类的值作为其主键值。服务器 B 将使用 2、12、22、32 等。这样它们就不会发生冲突。

显然,您可以为您的 auto_increment_increment 使用较低的值,例如 2,但根据您以后希望如何扩展集群,您可能需要给自己一些空间。

于 2013-04-04T20:15:12.783 回答
1

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

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

您可以尝试多种方法,其中包括:

  • 如果您的 id 是有符号整数,则最大值为 2147483647。在 dbB 中尝试将初始自动增量设置为 1073741824(将其设置为最大值的一半)。这样,在 dbB 中创建的所有 id 都位于更高的 id 区域中,并且不太可能发生冲突。
  • 尝试使用 guid 而不是自动递增 id(我应该如何在 MySQL 表中存储 GUID?

如果 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。所以你不能强制一台机器上的自动增量在它获得更高的 id 后保持低电平。

于 2013-04-04T19:55:04.517 回答
1

我建议将存储/检索控制权交给 AppC,它可以同时访问dbAdbB. AppC 也会创建主键。

于 2013-04-04T20:56:52.993 回答
0

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

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

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

基本上,这意味着取消两个副本中的一个并用另一个副本的同义词替换它。这是否符合您的需求,只有您自己知道。

于 2013-04-10T18:11:15.917 回答