2016-03-03 64 views
1

我在寻找一些帮助一个MySQL主 - 主配置问题。MySQL主 - 主复制曹景伟缺少自动增量值

我的工作已经由另一名雇员谁现在是无法提供这方面的任何援助,建立了一个服务器配置。这是我第一次体验这样的设置,经过相当多的研究后,我发现所有的信息都是相互矛盾的(或缺少!)。因此,如果我的问题很愚蠢,我很抱歉!

我的问题是这样的:

虽然复制服务器之间的工作,我有一个问题与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)。不幸的是,使用这个系统的软件只有在主设备1出现故障时才会连接到主设备2(两年前从启动以来没有发生过)。这意味着对于系统的一部分,我现在已经负责更新,我们还没有看到过甚至AI_Number ......永远!

使用:

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

我可以看到AI值是7765.然而,这两个表真实的 - 所以即使Master2从未有过的刀片上运行时直接下一个运行它将生成7766作为AI_Value。因此我的问题是这样的:

这是预期的或应该在Master2表具有1(当插入件在其上运行从而产生2)的值?如果这是预期的,那么是否有办法保持复制配置,但只有在插入运行时才增加Master2的AI_Value?

感谢您的帮助!

Chris

回答

1

不,你所看到的是正确的。

当从其他服务器复制行时,表格服务器的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中给出的相同的9 AUTO_INCREMENT使用INT(9/2)×2 + 2 = 10

这样,两个服务器上自动增量值被分配几乎在完全相同的顺序,相对于时间,因为插入物实际上发生了,而偏移提供了防止碰撞的保护。

在您所描述的设置中,通常会有大多数奇数或全部偶数值,并且设计上仍然没有使用这些缺口。插入的下一行(无论写入哪个服务器)都将具有比先前插入的行更高的自动增量值。

当第一次本地插入发生时,您的“主人2”将做正确的事情。给定表的当前值AUTO_INCREMENT预计在任何给定时间对所有主人都是相同的。

所以,不,它不能改变,它不应该改变。将行插入这些间隙会导致页面拆分和表空间碎片混乱,因为最初插入行时,存储器中没有剩余空白 - 您没有未使用的空间,只有未分配的数字。

+0

谢谢你的杰出回应Michael。 –