您好,登錄后才能下訂單哦!
pt-table-sync修復主從不一致
pt-table-sync簡介
顧名思義,它用來修復多個實例之間數據的不一致。它可以讓主從的數據修復到最終一致,也可以使通過應用雙寫或多寫的多個不相關的數據庫實例修復到一致。同時它還內部集成了pt-table-checksum的校驗功能,可以一邊校驗一邊修復,也可以基于pt-table-checksum的計算結果來進行修復。
工作原理
1. 單行數據checksum值的計算
計算邏輯與pt-table-checksum一樣,也是先檢查表結構,并獲取每一列的數據類型,把所有數據類型都轉化為字符串,然后用concat_ws()函數進行連接,由此計算出該行的checksum值。checksum默認采用crc32計算。
2. 數據塊checksum值的計算
同pt-table-checksum工具一樣,pt-table-sync會智能分析表上的索引,然后把表的數據split成若干個chunk,計算的時候以chunk為單位。可以理解為把chunk內所有行的數據拼接起來,再計算crc32的值,即得到該chunk的checksum值。
3. 壞塊檢測和修復
前面兩步,pt-table-sync與pt-table-checksum的算法和原理一樣。再往下,就開始有所不同:
pt-table-checksum只是校驗,所以它把checksum結果存儲到統計表,然后把執行過的sql語句記錄到binlog中,任務就算完成。語句級的復制把計算邏輯傳遞到從庫,并在從庫執行相同的計算。pt-table-checksum的算法本身并不在意從庫的延遲,延遲多少都一樣計算(有同事對此不理解,可以參考我的前一篇文章),不會影響計算結果的正確性(但是我們還是會檢測延遲,因為延遲太多會影響業務,所以總是要加上—max-lag來限流)。
pt-table-sync則不同。它首先要完成chunk的checksum值的計算,一旦發現主從上同樣的chunk的checksum值不同,就深入到該chunk內部,逐行比較并修復有問題的行。其計算邏輯描述如下(以修復主從結構的數據不一致為例,業務雙寫的情況修復起來更復雜—因為涉及到沖突解決和基準選擇的問題,限于篇幅,這里不介紹):
1. 對每一個從庫,每一個表,循環進行如下校驗和修復過程。
2. 對每一個chunk,在校驗時加上for update鎖。一旦獲得鎖,就記錄下當前主庫的show master status值。
3. 在從庫上執行select master_pos_wait()函數,等待從庫sql線程執行到show master status得到的位置。以此保證,主從上關于這個chunk的內容均不再改變。
4. 對這個chunk執行checksum,然后與主庫的checksum進行比較。
5. 如果checksum相同,說明主從數據一致,就繼續下一個chunk。
6. 如果checksum不同,說明該chunk有不一致。深入chunk內部,逐行計算checksum并比較(單行的checksum的比較過程與chunk的比較過程一樣,單行實際是chunk的size為1的特例)。
7. 如果發現某行不一致,則標記下來。繼續檢測剩余行,直到這個chunk結束。
8. 對找到的主從不一致的行,采用replace into語句,在主庫執行一遍以生成該行全量的binlog,并同步到從庫,這會以主庫數據為基準來修復從庫;對于主庫有的行而從庫沒有的行,采用replace在主庫上插入(必須不能是insert);對于從庫有而主庫沒有的行,通過在主庫執行delete來刪除(pt-table-sync強烈建議所有的數據修復都只在主庫進行,而不建議直接修改從庫數據;但是也有特例,后面會講到)。
9. 直到修復該chunk所有不一致的行。繼續檢查和修復下一個chunk。
10. 直到這個從庫上所有的表修復結束。開始修復下一個從庫。
重要選項
安全選項
—[no]check-triggers 檢查是否有觸發器,有則警告
—[no]foreign-key-checks 默認檢查主外鍵約束,有則警告
—[no]unique-checks 檢查是否有唯一索引,無則警告
過濾選項
—ignore-databases
—ignore-engines
—ignore-tables
其他選項
—replicate=s 與pt-table-checksum結合起來,只修復,而不校驗。使用pt-table-checksum之前校驗的結果
—bidirectional 雙向同步。通常都以主庫的數據為準,如果開啟雙向同步,就要定義沖突解決規則,會比較復雜
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
由于對表需要權限過大 故用superdba
前面是slave ip,port,user,password
后面是master ip,port,user,password
D–database
t-table
--print :打印,但不執行命令。
--execute :執行命令。
此時表明已經修復完成。可以重新再檢測一遍,確認是否修復;
replace 表必須有主鍵或者唯一索引,并且此表不能存在觸發器, 否則此方案不適用
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。