您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何使用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工具校驗修復主從”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。