MySQL 复制查询 - 需要主键

tes*_*747 3 mysql replication primary-key percona mysql-5.6

我对 MySQL 复制(主从)几乎没有怀疑。表是否必须具有用于复制的主查询才能正常运行?

参考上面问题的这个 Percona 链接,因为它提到如果没有定义主键或唯一键,那么情况更糟,因为 INSERT 可能会被重新执行,并且您将获得具有相同数据的多行 – 这再次意味着您已经得到与主人不一致的数据

但是使用 InnoDB 作为存储引擎,如果表没有定义主查询或唯一查询,引擎本身会根据Jeremy Cole 的博客在包含行 ID 值的合成列上创建隐藏的聚集索引

因此,即使在主要或唯一不存在的情况下,复制也不应该有任何影响,它本身会创建一个聚集索引,以确保复制顺利进行,对吗?我不确定这部分。

如果有人可以了解主从复制设置中主键的需求,那就太好了。

Mic*_*bot 5

你的假设是不正确的。

隐藏的聚集索引在这里没有任何帮助,因为服务器无法使用该索引以复制所需的方式查找行。

这会在 master 登录STATEMENT模式时导致一些问题,模式中出现不同的问题ROW,以及所有问题在模式中的组合MIXED。这是关于最大陷阱的 tl;dr:

针对没有主键或唯一键(其值可通过 SQL 接口访问)的表的每个复制事件都有可能需要对复制的每一行进行全表扫描。

隐藏聚集索引对 SQL 层的不可访问性使其无法使用......即使它不是隐藏的也无济于事,因为它的值在服务器之间是不确定的,因此它的值永远不会写入二进制日志。

很简单……您不应该创建没有可访问主键的表。这是糟糕的设计。

我认为一个有效的表不能有两个相同的行——根据定义,每个关系至少有一个候选键,并且候选键必须是唯一的,也是根据定义。选择一个并将其设为主要,或创建一个代理(自动增量)以使其可见。如果您有唯一约束,则需要在模式中定义它们,而不仅仅是将它们强加到代码中。