MySql 主-主复制导致缺少自动增量值

MySql Master-Master Replication Causing Missing AutoIncrement Values

我正在寻求有关 MySql Master-Master 配置问题的帮助。

我正在处理由另一名员工设置的服务器配置,该员工现在无法就此事提供任何帮助。这是我第一次体验这样的设置,在做了相当多的研究之后,我设法找到的所有信息都是相互矛盾的(或缺失的!)。因此,如果我的问题很愚蠢,我深表歉意!

我的问题是:

虽然复制在服务器之间进行,但我对 Auto_Increment 值的行为方式有疑问。

我很满意 AI 偏移量和增量设置正确:

-- Master1 -- 
auto_increment_increment = 2
auto_increment_offset = 1

-- Master2 -- 
auto_increment_increment = 2
auto_increment_offset = 2

这目前工作正常(大师 1 有奇数 AI_Numbers,大师 2 有偶数 AI_Numbers)。不幸的是,如果 Master 1 出现故障(自 2 年前启动以来从未发生过),一直使用该系统的软件仅连接到 Master 2。这意味着对于我现在负责更新的系统部分,我们甚至还没有看到 AI_Number... 曾经!

使用:

SHOW TABLE STATUS FROM `Database` LIKE 'TableName';

我可以看到 AI 值为 7765。然而,这对两个 tables 都是正确的 - 所以即使 Master2 在下一个是时从未直接插入 运行 运行 它将生成 7766 作为 AI_Value。因此我的问题是:

这是预期的还是 Master2 中的 table 的值为 1(因此当插入 运行 时生成 2)?如果这是预期的,那么有没有办法保留复制配置,但仅在插入 运行 时才增加 Master2 的 AI_Value?

感谢您的帮助!

克里斯

不,你看到的是正确的。

当从另一台服务器复制行时,未直接写入的 table 服务器的 AUTO_INCREMENT 值将增加,因此它永远不会小于插入的最大值迄今为止。

这些选项的命名可能有点违反直觉。每个服务器只会分配不小于当前值的值,并且在该服务器的所有从 0 开始的整数集合中,逐个偏移,逐个递增。

给定服务器上下一次插入的自动增量值为 INT(current_value / increment) x increment + offset

因此,如果 AUTO_INCREMENT 为 9,并且增量为 2,则偏移量为 1 的服务器 A 将在 int(9/2) x 2 + 1 处进行下一次插入,因此下一行将为 9.. . 但是服务器 B 的偏移量 2 给定相同的 AUTO_INCREMENT of 9 使用 int(9/2) x 2 + 2 = 10

这样,两台服务器上的自动递增值的分配 几乎 的顺序与插入实际发生时的顺序完全相同,偏移量提供保护碰撞。

在您所描述的设置中,通常具有大部分全奇数或全偶数的值,并且间隙未被使用,这是设计使然。插入的下一行,无论写入哪个服务器,其自动增量值都将高于任何先前插入的行。

您的 "Master 2" 将在第一次本地插入发生时做正确的事情。给定 table 的当前 AUTO_INCREMENT 值预计在任何给定时间在所有母版上都是相同的。

所以,不,不能改,也不应该改。将行插入这些间隙会导致页面拆分混乱和 tablespace 碎片化,因为最初插入行时,存储中没有剩余间隙——您没有未使用的 space 那里,只有未分配的号码。