如何解決MySQL中g(shù)h-ost改雙主表結(jié)構(gòu)主鍵沖突問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供梅州企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、H5場景定制、小程序制作等業(yè)務(wù)。10年已為梅州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
1)背景:
最近幫業(yè)務(wù)方排查了兩例主主復(fù)制丟數(shù)據(jù)或者主鍵沖突的問題,DB側(cè)的同事也問我這是什么一個原理,在解答他們的同時,順便也把這個問題記錄一下
2)現(xiàn)象:
公司一南北業(yè)務(wù)采用主主復(fù)制,而且該表的主鍵是自增ID,每個主庫的自增ID是錯開的,但是業(yè)務(wù)的主鍵卻出現(xiàn)了主鍵沖突,開始以為是設(shè)置不當(dāng),或者認(rèn)為修改造成,但是翻看歷史記錄,沒人有過操作,而且配置也正確,沒人重啟;在調(diào)查binlog中,發(fā)現(xiàn)了一個有意思的現(xiàn)象,MySQL的一個主庫binlog中出現(xiàn)了兩條主鍵ID是一樣的binlog,而且是insert產(chǎn)生的binlog,具體現(xiàn)象如下:
17:19分一條
17:22分鐘的一條
開始自己的感覺是懵逼的,怎么主鍵相同,還能插入同一張表?后面猛然一想,這應(yīng)該是gh-ost改表結(jié)構(gòu)造成的(本公司DBA嚴(yán)重不足,部分DB操作只能讓業(yè)務(wù)運(yùn)維也承擔(dān)一部分了)
3)模擬分析:
前提:假設(shè)有兩個雙主,分別叫主庫A與主庫B,上面存在表T,T表只有一個主鍵,在ghost修改之前的表,我們叫T,修改之后的表是T'(T跟T'其實是同一張表,只是產(chǎn)生的時間不同的叫法,方便表示)
①主庫B進(jìn)行rename table T to T_old,new_t TO T操作,這時候主庫A是T'表了
②同時主庫A插入T表13的數(shù)據(jù),但是主庫B還沒收到(延遲關(guān)系)
③主庫A的T表被主庫B傳過來的rename table T to T_old,new_t TO T修改,變成了T';由于T'表在主庫B還沒收到第二步發(fā)過來的13,所以主庫A的T'表肯定也沒13這個值
④主庫A在這時又向T'插入13,正在復(fù)制給主庫B的T'中(由于延遲,還沒發(fā)送到主庫的T'表)
⑤主庫B的T'接收到第二步主庫A插入T的13
⑥第四步主庫A寫入T'的13已經(jīng)傳到主庫B,發(fā)現(xiàn)B主庫的T'表已經(jīng)有了13(第五步過來的),然后主鍵沖突
到此,主鍵沖突的原因已經(jīng)找到,這種沖突意味著數(shù)據(jù)有丟失(此分析需要你對gh-ost的原理有充分的理解)
4)如何避免
在用gh-ost修改表結(jié)構(gòu)的工程中,如果是雙主都有寫入,則必須將寫入切到單邊,然后再進(jìn)行修改
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。