共計 3017 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章主要為大家展示了“如何使用 pt 工具校驗修復主從”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“如何使用 pt 工具校驗修復主從”這篇文章吧。
使用 pt 工具校驗主從一致性并修復【原理說明】
pt-table-checksum 是 Percona-Toolkit
的組件之一,用于檢測 MySQL 主、從庫的數據是否一致。其原理是在主庫執行基于 statement 的 sql 語句來生成主庫數據塊的 checksum,把相同的 sql 語句傳遞到從庫執行,并在從庫上計算相同數據塊的 checksum,最后,比較主從庫上相同數據塊的 checksum 值,由此判斷主從數據是否一致。檢測過程根據唯一索引將表按 row 切分為塊(chunk),以為單位計算,可以避免鎖表。檢測時會自動判斷復制延遲、
master 的負載,超過閥值后會自動將檢測暫停,減小對線上服務的影響。
pt-table-checksum 默認情況下可以應對絕大部分場景,官方說,即使上千個庫、上萬億的行,它依然可以很好的工作,這源自于設計很簡單,一次檢查一個表,不需要太多的內存和多余的操作;必要時,pt-table-checksum 會根據服務器負載動態改變 chunk 大小,減少從庫的延遲。
為了減少對數據庫的干預,pt-table-checksum 還會自動偵測并連接到從庫,當然如果失敗,可以指定 –recursion-method 選項來告訴從庫在哪里。它的易用性還體現在,復制若有延遲,在從庫
checksum 會暫停直到趕上主庫的計算時間點(也通過選項 – 設定一個可容忍的延遲最大值,超過這個值也認為不一致)。
為了保證主數據庫服務的安全,該工具實現了許多保護措施:
1)自動設置 innodb_lock_wait_timeout 為 1s,避免引起鎖
2)默認當數據庫有 25 個以上的并發查詢時,pt-table-checksum 會暫停。可以設置 –max-load 選項來設置這個閥值
3)當用
Ctrl+C 停止任務后,工具會正常的完成當前 chunk 檢測,下次使用 –resume 選項啟動可以恢復繼續下一個
chunk
【工作過程】
1.
連接到主庫:pt 工具連接到主庫,然后自動發現主庫的所有從庫。默認采用 show slave hosts 來查找從庫,但是這只有在主從實例端口相同的情況下才有效。
2.
查找主庫或者從庫是否有復制過濾規則:這是為了安全而默認檢查的選項。你可以關閉這個檢查,但是這可能導致 checksum 的 sql 語句要么不會同步到從庫,要么到了從庫發現從庫沒有要被 checksum 的表,這都會導致從庫同步卡庫。
3. 開始獲取表,一個個的計算。
4.
如果是表的第一個 chunk,那么 chunk-size 一般為 1000;如果不是表的第一個 chunk,那么采用 12 步中分析出的結果。
5. 檢查表結構,進行數據類型轉換等,生成 checksum 的 sql 語句。
6. 根據表上的索引和數據的分布,選擇最合適的 split 表的方法。
7. 開始 checksum 表。
8. 默認在 chunk 一個表之前,先刪除上次這個表相關的計算結果。除非–resume。
9.
根據 explain 的結果,判斷 chunk 的 size 是否超過了你定義的 chunk-size 的上限。如果超過了,為了不影響線上性能,這個 chunk 將被忽略。
10. 把要 checksum 的行加上 for update 鎖,并計算。
11. 把計算結果存儲到 master_crc master_count 列中。
12. 調整下一個 chunk 的大小。
13.
等待從庫追上主庫。如果沒有延遲備份的從庫在運行,最好檢查所有的從庫,如果發現延遲最大的從庫延遲超過 max-lag 秒,pt 工具在這里將暫停。
14. 如果發現主庫的 max-load 超過某個閾值,pt 工具在這里將暫停。
15. 繼續下一個 chunk,直到這個 table 被 chunk 完畢。
16. 等待從庫執行完 checksum,便于生成匯總的統計結果。每個表匯總并統計一次。
17. 循環每個表,直到結束。
【校驗腳本】
pt 工具如果使用不當,會影響業務正常使用,甚至出現死鎖情況,下面結合生產經驗,使用如下參數進行校驗
TS:完成檢查的時間戳。
ERRORS
:檢查時候發生錯誤和警告的數量。
DIFFS:不一致的 chunk 數量。當指定 –no-replicate-check 即檢查完但不立即輸出結果時,會一直為 0;當指定 –replicate-check-only 即不檢查只從 checksums 表中計算 crc32,且只顯示不一致的信息(畢竟輸出的大部分應該是一致的,容易造成干擾)。
ROWS:比對的表行數。
CHUNKS:被劃分到表中的塊的數目。
SKIPPED
:由于錯誤或警告或過大,則跳過塊的數目。
TIME:執行的時間。
TABLE:被檢查的表名
【修復腳本】
點擊 (此處) 折疊或打開
user=
password=
charset= utf8mb4
replicate= pt.checksum
chunk_size= 1500
pid= /data/script/mysql/pt-table-sync.pid
sync_to_master= h=10.9.129.33,P=3306
tables= kuaikan.device_push_info
/usr/bin/pt-table-sync \
–user=${user} \
–password=${password} \
–pid=${pid} \
–bin-log \
–tables= ${tables} \
–buffer-in-mysql \
–no-buffer-to-client \
–charset=${charset} \
–no-check-child-tables \
–no-foreign-key-checks \
–check-master \
–replicate=${replicate} \
–sync-to-master ${sync_to_master} \
–check-slave \
–check-triggers \
–chunk-size=${chunk_size} \
–print \
–transaction \
–verbose
【修復腳本參數說明】
1)print 只是打印需要執行的命令,確認無誤后把參數—print 改成—execute
2)sync_to_master 此處填寫從庫的地址,只需要填寫從庫地址,會自動從從庫 show slave status 獲取主庫的信息,不需要再寫主庫的地址,寫了從庫地址后,會根據從庫差異對這個從庫進行更改,無論如何都是在 master 端執行。并不會對其他從庫的差異進行修復。
3)no-buffer-to-client 如果禁用該選項的話,MySQL 會一次性發送所有的 rows,針對大表
4)lock 參數如果 使用—replicate 或者 –sync-to-master 參數時,slave 端 是不會鎖表的。鎖表的時候使用的是 lock tables,但是如果使用 –transaction 的話,就是在事務開始到提交這一段,開始鎖表
以上是“如何使用 pt 工具校驗修復主從”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!