pt-table-checksum進行主從資料校驗

君落塵發表於2015-03-18

前言:mysql的主從配置靈活簡單,有時候太過於靈活了,所以經常會出現主從資料庫不一致的問題,而這種不一致的情況多了或者出現在某個重要的業務場景的時候,mysql的資料的公信力就受到了嚴重的質疑,IT的價值就降低了,如果把這種訊號傳遞給中心的領導,那麼mysql dba的價值也就體現出來了。

主從不一致時的處理方法:通常我們處理主從不一致

主從資料的一致性校驗是個頭疼的問題,偶爾被業務投訴主從資料不一致,或者幾個從庫之間的 資料不一致,這會令人沮喪。通常我們僅有一種辦法,熱備主庫,然後替換掉所有的從庫。這不僅代價非常大,而且類似治標不治本的方案,讓人十分不安。因此我們需要合適的工具,至少幫我們回答下面三個問題:

  • 是從庫延遲導致了使用者看到的資料不一致,還是真的主從資料就不一致?
  • 如果不一致,這個比例究竟多大?
  • 下次還會出現嗎?

回答清楚這幾個問題,有助於我們決定是否修復,以及修復的方式,還可以幫我們找出不一致的資料,進而定位問題根源。而percona的pt-table-checksum正是我們想要的。

 

Percona在針對mysql的管理方面提供了很多便捷的工具,並整合在percona-toolkit工具包裡,下載網站如下:

在linux中,wget

工具包提供的工具很多:

image

本文件詳細介紹pt-table-checksum和pt-table-sync這兩個工具的使用;

 

一、環境說明

1、主資料庫

IP地址:192.168.47.166

主機名:mysql01

同步資料庫名稱:test

 

2、從資料庫

IP地址:192.168.47.165

主機名:mysql02

image

現在資料庫的主從狀態是一致的;

 

二、語法

pt-table-checksum [OPTIONS] [DSN]

[root@mysql02 data]# pt-table-checksum  --help
pt-table-checksum performs an online replication consistency check by executing checksum queries on the master, which produces different results on replicas that are inconsistent with the master.  The optional DSN specifies the master host.  The tool's L is non-zero if any differences are found, or if any warnings or errors occur.  For more details, please use the –help option, or try 'perldoc /bin/pt-table-checksum' for complete documentation.

Usage: pt-table-checksum [OPTIONS] [DSN]

 

常用語法說明:

--nocheck-replication-filters :不檢查複製過濾器,建議啟用。後面可以用--databases來指定需要檢查的資料庫。

--no-check-binlog-format      :不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。

--replicate-check-only          :只顯示不同步的資訊。(注意:要謹慎使用,此引數不會生成新的checksums資料,只會根據checksums表已經有的資料來顯示。)

--replicate                            :把checksum的資訊寫入到指定表中,建議直接寫到被檢查的資料庫當中。

--databases=                         :指定需要被檢查的資料庫,多個則用逗號隔開。

--tables=                                :指定需要被檢查的表,多個用逗號隔開

--host=127.0.0.1                    :Master的地址

--user=root                            :使用者名稱

--password=123456                :密碼

--port=3306                                 :埠

詳細的選項說明:

 

三、測試

1、兩邊資料都是一致的情況下,進行pt-table-checksum進行測試

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums --host=192.168.47.167 --port=3306 --user=root --password=123456

TS                    ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME         TABLE
03-10T14:17:18      0          0            4       1             0               0.025    test.john

 

說明:

TS              :完成檢查的時間。

ERRORS       :檢查時候發生錯誤和警告的數量。

DIFFS          :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。

ROWS         :被檢查表的行數

CHUNKS      :被劃分到表中的塊的數目。

SKIPPED     :由於錯誤或警告或過大,則跳過塊的數目。

TIME          :執行的時間。

TABLE        :被檢查的表名。

這邊可以直接顯示兩個表的資料情況,因為我們在進行校驗的時候會寫入到test.checksums表中,所以可以登入到資料庫進行結果的檢查;

mysql> select * from test.checksums;
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+-----------------------+
| db   | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                          |
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+-------------------------+
| test | john |     1 |       0.005105 | NULL             | NULL                   | NULL                   | 709a8dc  |           4 | 709a8dc      |                4 | 2015-03-10 14:17:18 |
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+--------------------------+
1 row in set (0.00 sec)  

注:當前主從資料庫的資料都是4條;

可以看出,當前test資料庫下面的john這個表是一致的。

 

2、修改從表的資料,使主從資料不一致,方法:在從庫上面增加一條記錄

imageimage

 

然後進行主從資料庫的校驗

[root@mysql01 ~]# pt-table-checksum  --nocheck-replication-filters --replicate=test.checksums --databases=test  h=192.168.47.167,u=root,p=123456
TS                  ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME          TABLE
03-10T14:29:30      0     1             4       1                 0             0.026    test.john

DIFFS:1 表示當前主從資料庫已經不一致;

 

登入主資料庫檢視test.checksums表的記錄:主資料庫顯示this_cnt:4,master_cnt=4,這條記錄顯示的是:當前庫表的記錄資訊和主庫的記錄資訊,因為兩個庫是同一個庫,所以這裡顯示的cnt值都是一樣的;

 image,

 

登入到從庫檢視test.checksums表的記錄,從庫顯示的john表中,this_cnt和master_cnt值是不一致的;

image

 

總結:一般進行主從校驗的時候往往不是一兩個表的核對,一個正常的業務的資料庫包含的表個數一般超過100個,根據判斷的情況可以直接對this_cnt和master_cnt進行比對;

指令碼如下:select db,tbl,chunk,this_crc,this_cnt,master_crc,master_cnt,ts from checksums  where this_cnt<>master_cnt ;

 

整個校驗的過程從技術上來講是很簡單的,但是所帶來的業務價值卻是很高的。而DBA人員怎麼把這個過程創造出來的業務價值體現出來,這是比技術更值得去深思的;

....................................................................................................................................................................

本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 ) 

.....................................................................................................................................................................

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29819001/viewspace-1464123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章