我正在寻找使用MySDQL实现多站点复制的最佳方法。由于我主要是MS-SQL用户,因此对MySQL复制术语和多个MySQL版本不完全相同,我感到非常不舒服。复制,uuid字段作为主键,基于行的复制
根据SQL术语,我的目标是拥有一个发布者和许多订阅者。 Suscribers开放给用户更新。更改将与发布者一起复制,然后发布者将这些更改分发给其他用户。
所以我的目标是确定用于我们表格的正确的主键规则。由于我们只需要代理键,所以我们可以使用整数\ autoincrement或uuid/uuid_short字段。为避免复制冲突,整数\ autoincrement不符合我们的需要,因为在两次同步之间,两个服务器在同一个表中插入一条记录时,可能会产生复制冲突。因此,根据我的,正确的解决方案,以避免复制\主键冲突将是:
- 使用UUID或UUID短领域作为主键
- 有相应的UUID值由接入服务器设置时间
- 将复制设置为RBR(基于行的复制 - 相当于MS-SQl合并复制的声音)模式,而不是SBR(基于语句的复制 - 听起来像事务复制)。据我了解,RBR会在复制时将计算出的uuid值“按原样”插入其他服务器,而SBR将调用uuid()函数并在每个服务器上生成一个新值...因此造成严重问题!
它会工作吗?
如果您将主键定义为'PRIMARY KEY(id,server_id)',然后在每个新添加的服务器上为'server_id'列设置默认值 - 您可以避免使用UUID并避免pk冲突。 –
这是一个解决方案,但我不想拥有复合主键。他们让JOINS很难理解。我相信有一种方法可以让它在没有这种解决方案的情况下工作。不管怎么说,还是要谢谢你。 –
UUID增加了很多开销,并且在JOIN中增加了一个'AND'实际上不应该是使用auto_increment作为PK失败的标准。我尝试了两种方式,UUID是我的第一选择,但是它们很慢,很长,会为InnoDB造成问题,并且当你想在你的db中手动查找某些东西时 - 看起来完全是胡言乱语,使得很难快速查找某些东西。 –