您好,登錄后才能下訂單哦!
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的值,即得到該chunk的checksum值。
3. 壞塊檢測(cè)和修復(fù)
前面兩步,pt-table-sync與pt-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則不同。它首先要完成chunk的checksum值的計(jì)算,一旦發(fā)現(xiàn)主從上同樣的chunk的checksum值不同,就深入到該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í)際是chunk的size為1的特例)。
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í)行命令。
此時(shí)表明已經(jīng)修復(fù)完成??梢灾匦略贆z測(cè)一遍,確認(rèn)是否修復(fù);
replace 表必須有主鍵或者唯一索引,并且此表不能存在觸發(fā)器, 否則此方案不適用
免責(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)容。