1. 程式人生 > 其它 >Mysql一致性效驗_pt工具

Mysql一致性效驗_pt工具

目錄

一.簡介

pt工具可以隨機抽取主從的資料進行對比,用於測試主從資料一致性。也可以對不一致資料進行修復。這個工具在主或者從上安裝均可

二.原理介紹

它通過在主庫執行基於statement的sql語句來生成主庫資料塊的checksum,把相同的sql語句傳遞到從庫,並在從庫上計算相同資料塊的checksum,最後,比
較主從庫上相同資料塊的checksum值,由此判斷主從資料是否一致。這種校驗是分表進行的,在每個表內部又是分塊進行的,而且pt工具本身提供了非常多的限
流選項,因此對線上服務的衝擊較小。

pt工具選擇智慧分析表上的索引,然後把表的資料split成一個個chunk,計算的時候也是以chunk為單位。每一次對chunk進行checksum後,pt工具都會對耗時
進行統計分析,並智慧調整下一個chunk的大小,避免chunk太大對線上造成影響,同時也要避免chunk太小而效率低下。

連線到主庫:pt工具連線到主庫,然後自動發現主庫的所有從庫。預設採用show full processlist來查詢從庫,但是這隻有在主從例項埠相同的情況下才有效。

內部工作過程:

  1. 連線到主庫:pt工具連線到主庫,然後自動發現主庫的所有從庫。預設採用show full processlist來查詢從庫,但是這隻有在主從例項埠相同的情況
    下才有效。
  2. 查詢主庫或者從庫是否有複製過濾規則:這是為了安全而預設檢查的選項。你可以關閉這個檢查,但是這可能導致checksum的sql語句要麼不會同步到從
    庫,要麼到了從庫發現從庫沒有要被checksum的表,這都會導致從庫同步卡庫。
  3. 開始獲取表,一個個的計算。
  4. 檢查表結構,進行資料型別轉換等,生成checksum的sql語句。
  5. 根據表上的索引和資料的分佈,選擇最合適的split表的方法。
  6. 開始checksum表。
  7. 預設在chunk一個表之前,先刪除上次這個表相關的計算結果。除非—resume。
  8. 根據explain的結果,判斷chunk的size是否超過了你定義的chunk-size的上限。如果超過了,為了不影響線上效能,這個chunk將被忽略。
  9. 把要checksum的行加上for update鎖,並計算。
  10. 把計算結果儲存到master_crc master_count列中。
  11. 調整下一個chunk的大小。
  12. 等待從庫追上主庫。如果沒有延遲備份的從庫在執行,最好檢查所有的從庫,如果發現延遲最大的從庫延遲超過max-lag秒,pt工具在這裡將暫停。
  13. 如果發現主庫的max-load超過某個閾值,pt工具在這裡將暫停。
  14. 繼續下一個chunk,直到這個table被chunk完畢。
  15. 等待從庫執行完checksum,便於生成彙總的統計結果。每個表彙總並統計一次。
  16. 迴圈每個表,直到結束。

三.選項

使用選項:
--[no]check-replication-filter 是否檢查複製過濾規則,如果主庫和從庫都沒有過濾規則,可以選擇不檢查過濾規則
--[no]check-binlog-format pt需要主庫使用STATEMENT格式的binlog, 如果binlog是MIXED格式,最好指定--nocheck-binlog-format
--check-slave-tables 檢查是否所有從庫都有被檢查的表和列,會消耗一定的時間

安全選項:
--chunk-size-limit 將表分成chunk的最大大小,超過這個值的chunk則跳過
--check-slave-lag 指定只檢查某個從庫的延遲,不指定則檢查所有從庫的延遲
--max-lag 最大延遲,如果從庫與主庫之間的延遲超過這個值, pt將會等待從庫與主庫同步
--max-load 最大負載,如果主庫上的負載超過這個值, pt將會等待主庫的負載降低

限制選項:
--replicate 指定檢查的結果存放位置,預設存放在percona.checksums表中,可以手動指定其他表
--databases 只檢查某些庫
--tables 只檢查某些表
這些過濾選項在修復不一致資料後,檢查修復效果很有用。

過濾選項:
--resume 上次檢查因為某種原因中斷,下次接著執行,不用從頭開始
--chunk-time 檢查每個chunk的用時,預設是0.5s

四.環境

系統:centos-7.3 2臺
mysql版本:5.7
軟體版本:3.0.3

五.部署

1.安裝依賴
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Digest-MD5

2.安裝原始碼包
wget https://www.percona.com/downloads/percona-toolkit/3.0.3/binary/redhat/6/x86_64/percona-toolkit-3.0.3-1.el6.x86_64.rpm
yum localinstall percona-toolkit-3.0.3-1.el6.x86_64.rpm

3.在master和slave建立賬號:
mysql>GRANT SELECT,PROCESS,SUPER,REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'check'@'%' identified by '123456';
mysql>flush privileges;
說明:指定host為安裝軟體的機器ip

4.執行:
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=cnt.checksums --databases=cnt --tables=ldb_alipay_order h=1.1.1.1,u=check,p=123456,P=3306

引數說明:
--no-check-replication-filters 表示不需要檢查 Master 配置裡是否指定了 Filter。 預設會檢查,如果配置了 Filter,如 replicate_do_db,replicate-wild-ignore-table,binlog_ignore_db 等,在從庫checksum就與遇到表不存在而報錯退出,所以官方預設是yes(--check-replication-filters)但我們實際在檢測中時指定--databases=,所以就不存在這個問題,乾脆不檢測。

--no-check-binlog-format 不對binlog的格式進行檢查

--replicate-check-only 只顯示主從不一致部分,此引數不會生成新的checksums資料,只會根據checksums表已經有的資料來顯示

--databases=,-d:要檢查的資料庫,逗號分隔。 --databases-regex 正則匹配要檢測的資料庫,--ignore-databases[-regex]忽略檢查的庫。Filter選項。

--tables=,-t:要檢查的表,逗號分隔。如果要檢查的表分佈在不同的db中,可以用--tables=dbname1.table1,dbnamd2.table2的形式。
同理有--tables-regex,--ignore-tables,--ignore-tables-regex。--replicate指定的checksum表始終會被過濾。

TS :完成檢查的時間
ERRORS :檢查時候發生錯誤和警告的數量
DIFFS :0表示一致,1表示不一致。當指定–no-replicate-check時,會一直為0,當指定–replicate-check-only會顯示不同的資訊
ROWS :表的行數
CHUNKS :被劃分到表中的塊的數目
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目
TIME :執行的時間
TABLE :被檢查的表名

提示錯誤:
問題一:
Waiting for the --replicate table to replicate to localhost.localdomain...
問題出在percona.checksums 表在從庫不存在,根本原因是沒有從主庫同步過來,所以看一下從庫是否延遲嚴重。

問題二:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
上面的提示資訊很清楚,因為找不到從,所以執行失敗。用引數--recursion-method 可以指定模式解決.

測試:
主不寫,從寫入1條資料,再執行效驗工具,可以看到錯誤

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。