2016-03-03 67 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。 –