溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

pt-table-sync修復(fù)主從不一致

發(fā)布時(shí)間:2020-06-28 04:52:19 來(lái)源:網(wǎng)絡(luò) 閱讀:741 作者:524683249 欄目:數(shù)據(jù)庫(kù)

pt-table-sync修復(fù)主從不一致

pt-table-sync簡(jiǎn)介

顧名思義,它用來(lái)修復(fù)多個(gè)實(shí)例之間數(shù)據(jù)的不一致。它可以讓主從的數(shù)據(jù)修復(fù)到最終一致,也可以使通過(guò)應(yīng)用雙寫或多寫的多個(gè)不相關(guān)的數(shù)據(jù)庫(kù)實(shí)例修復(fù)到一致。同時(shí)它還內(nèi)部集成了pt-table-checksum的校驗(yàn)功能,可以一邊校驗(yàn)一邊修復(fù),也可以基于pt-table-checksum的計(jì)算結(jié)果來(lái)進(jìn)行修復(fù)。

工作原理

1. 單行數(shù)據(jù)checksum值的計(jì)算

計(jì)算邏輯與pt-table-checksum一樣,也是先檢查表結(jié)構(gòu),并獲取每一列的數(shù)據(jù)類型,把所有數(shù)據(jù)類型都轉(zhuǎn)化為字符串,然后用concat_ws()函數(shù)進(jìn)行連接,由此計(jì)算出該行的checksum值。checksum默認(rèn)采用crc32計(jì)算。

2. 數(shù)據(jù)塊checksum值的計(jì)算

pt-table-checksum工具一樣,pt-table-sync會(huì)智能分析表上的索引,然后把表的數(shù)據(jù)split成若干個(gè)chunk,計(jì)算的時(shí)候以chunk為單位??梢岳斫鉃榘?/span>chunk內(nèi)所有行的數(shù)據(jù)拼接起來(lái),再計(jì)算crc32的值,即得到該chunkchecksum值。

3. 壞塊檢測(cè)和修復(fù)

前面兩步,pt-table-syncpt-table-checksum的算法和原理一樣。再往下,就開(kāi)始有所不同:

pt-table-checksum只是校驗(yàn),所以它把checksum結(jié)果存儲(chǔ)到統(tǒng)計(jì)表,然后把執(zhí)行過(guò)的sql語(yǔ)句記錄到binlog中,任務(wù)就算完成。語(yǔ)句級(jí)的復(fù)制把計(jì)算邏輯傳遞到從庫(kù),并在從庫(kù)執(zhí)行相同的計(jì)算。pt-table-checksum的算法本身并不在意從庫(kù)的延遲,延遲多少都一樣計(jì)算(有同事對(duì)此不理解,可以參考我的前一篇文章),不會(huì)影響計(jì)算結(jié)果的正確性(但是我們還是會(huì)檢測(cè)延遲,因?yàn)檠舆t太多會(huì)影響業(yè)務(wù),所以總是要加上—max-lag來(lái)限流)。 

pt-table-sync則不同。它首先要完成chunkchecksum值的計(jì)算,一旦發(fā)現(xiàn)主從上同樣的chunkchecksum值不同,就深入到該chunk內(nèi)部,逐行比較并修復(fù)有問(wèn)題的行。其計(jì)算邏輯描述如下(以修復(fù)主從結(jié)構(gòu)的數(shù)據(jù)不一致為例,業(yè)務(wù)雙寫的情況修復(fù)起來(lái)更復(fù)雜因?yàn)樯婕暗經(jīng)_突解決和基準(zhǔn)選擇的問(wèn)題,限于篇幅,這里不介紹)

1. 對(duì)每一個(gè)從庫(kù),每一個(gè)表,循環(huán)進(jìn)行如下校驗(yàn)和修復(fù)過(guò)程。

2. 對(duì)每一個(gè)chunk,在校驗(yàn)時(shí)加上for update鎖。一旦獲得鎖,就記錄下當(dāng)前主庫(kù)的show master status值。

3. 在從庫(kù)上執(zhí)行select master_pos_wait()函數(shù),等待從庫(kù)sql線程執(zhí)行到show master status得到的位置。以此保證,主從上關(guān)于這個(gè)chunk的內(nèi)容均不再改變。

4. 對(duì)這個(gè)chunk執(zhí)行checksum,然后與主庫(kù)的checksum進(jìn)行比較。

5. 如果checksum相同,說(shuō)明主從數(shù)據(jù)一致,就繼續(xù)下一個(gè)chunk。

6. 如果checksum不同,說(shuō)明該chunk有不一致。深入chunk內(nèi)部,逐行計(jì)算checksum并比較(單行的checksum的比較過(guò)程與chunk的比較過(guò)程一樣,單行實(shí)際是chunksize1的特例)。

7. 如果發(fā)現(xiàn)某行不一致,則標(biāo)記下來(lái)。繼續(xù)檢測(cè)剩余行,直到這個(gè)chunk結(jié)束。

8. 對(duì)找到的主從不一致的行,采用replace into語(yǔ)句,在主庫(kù)執(zhí)行一遍以生成該行全量的binlog,并同步到從庫(kù),這會(huì)以主庫(kù)數(shù)據(jù)為基準(zhǔn)來(lái)修復(fù)從庫(kù);對(duì)于主庫(kù)有的行而從庫(kù)沒(méi)有的行,采用replace在主庫(kù)上插入(必須不能是insert);對(duì)于從庫(kù)有而主庫(kù)沒(méi)有的行,通過(guò)在主庫(kù)執(zhí)行delete來(lái)刪除(pt-table-sync強(qiáng)烈建議所有的數(shù)據(jù)修復(fù)都只在主庫(kù)進(jìn)行,而不建議直接修改從庫(kù)數(shù)據(jù);但是也有特例,后面會(huì)講到)。

9. 直到修復(fù)該chunk所有不一致的行。繼續(xù)檢查和修復(fù)下一個(gè)chunk

10. 直到這個(gè)從庫(kù)上所有的表修復(fù)結(jié)束。開(kāi)始修復(fù)下一個(gè)從庫(kù)。

重要選項(xiàng)

安全選項(xiàng)

—[no]check-triggers 檢查是否有觸發(fā)器,有則警告 

—[no]foreign-key-checks 默認(rèn)檢查主外鍵約束,有則警告 

—[no]unique-checks 檢查是否有唯一索引,無(wú)則警告

過(guò)濾選項(xiàng)

—ignore-databases 

—ignore-engines 

—ignore-tables

其他選項(xiàng)

—replicate=s pt-table-checksum結(jié)合起來(lái),只修復(fù),而不校驗(yàn)。使用pt-table-checksum之前校驗(yàn)的結(jié)果 

—bidirectional 雙向同步。通常都以主庫(kù)的數(shù)據(jù)為準(zhǔn),如果開(kāi)啟雙向同步,就要定義沖突解決規(guī)則,會(huì)比較復(fù)雜

 

pt-table-checksum命令

cd /data/work/percona-toolkit-2.1.1/bin

./pt-table-sync --print h='192.168.0.90',u='superdba',p='*****',P=3650,D='expert',t='doctor' --sync-to-master h=192.168.0.5,P=3650   

由于對(duì)表需要權(quán)限過(guò)大 故用superdba

前面是slave ip,port,user,password

后面是master ip,port,user,password

D–database

t-table

--print :打印,但不執(zhí)行命令。

--execute :執(zhí)行命令。

pt-table-sync修復(fù)主從不一致

pt-table-sync修復(fù)主從不一致

此時(shí)表明已經(jīng)修復(fù)完成??梢灾匦略贆z測(cè)一遍,確認(rèn)是否修復(fù);

replace 表必須有主鍵或者唯一索引,并且此表不能存在觸發(fā)器, 否則此方案不適用


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI