pt table checksum使用檢測主從不一致

weixin_33809981發表於2018-01-05

title: pt-table-checksum使用檢測主從不一致 tags:

  • pt-table-checksum
  • percona-toolkit categories: mysql date: 2017-11-10 16:42:07

背景

為了專案後期讀寫分離做準備 必要的資料一致性檢測還是有必要的。並且主從出現不一致的情況還是會有

從上篇我們安裝了percona-toolkit

本篇介紹pt-table-checksum的使用

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

使用

使用起來絕對不復雜 建立特定許可權的使用者後將會自動發現從庫 統計出來不一樣的資料

我們在建立好指定的表之後直接執行如下語句

    pt-table-checksum --create-replicate-table --nocheck-replication-filters --databases=f6dms  --ignore-tables-regex=tm_monitor.* h=***,u=***,p=***,P=3306 --no-check-binlog-format
複製程式碼

成功找到多條不一致資料

同步完成後 各位可以在對應從庫執行如下

    select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR
    ISNULL(master_crc) <> ISNULL(this_crc)
複製程式碼

看看我們的slave 滿目瘡痍……

參考

segmentfault.com/a/119000000…

相關文章