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 那里,只有未分配的号码。
我正在寻求有关 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 那里,只有未分配的号码。