pt-table-checksum原理詳解
環境
MySQL: MySQL 5.6.27
OS: centos 6.6
tool: pt-table-checksum 2.2.15
它能做什麼
業界最流行的MySQL主從資料對比工具,資料一致性檢測最好的的工具,沒有之一
如何使用
./pt-table-checksum -hxx -P 3306 -u backup -p backup –no-check-binlog-format –databases=xx_db,yy_db,zz_db –no-check-replication-filters
如何找到不一致的地方
* slave上執行:
SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
FROM percona.checksums
WHERE (
master_cnt <> this_cnt
OR master_crc <> this_crc
OR ISNULL(master_crc) <> ISNULL(this_crc))
GROUP BY db, tbl;
原理
大致的原理網上都能看到,這裡會描述幾個核心的點
這裡假設就一個庫,一張表,100條記錄
pt-table-checksum進行比對的時候,不是一條條記錄比的,而是一個個chunk進行對比
這裡我們將100條記錄分為10個chunk,一個chunk 10條記錄。
每個chunk對比完後,再進行下一個chunk對比,直到全部結束。所以,這裡我們就以一個chunk來描述下面的原理即可
- master> /!50108 SET @@binlog_format := `STATEMENT`/ 設定binlog-format為statement
- master> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 這是隔離級別為RR,利用RR的特性讓資料在這一刻靜止,就不用加鎖了。
- master> checksums表:REPLACE INTO select設定this_cnt, this_crc(傳遞到slave,這其實設定slave每個chunk的cnt,crc),演算法來自:COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(
主鍵
) AS UNSIGNED)), 10, 16)), 0) - slave> 當同步追上後,開始執行REPLACE INTO select,然後設定slave每個chunk的cnt,crc
- master> checksums表:update master_cnt,master_crc ,這是設定master每個chunk的cnt,crc
- slave> 當同步追上後,開始執行update master_cnt,master_crc ,這是設定master每個chunk的cnt,crc
以上,基本完成。 接下來只需要去checksums表中找 master_cnt <> this_cnt or OR master_crc <> this_crc 的記錄就行
常問的問題
- 一般在什麼場景下使用pt-table-checksum?會在生產環境的master上用嗎?
- 如果不太在乎master和slave之間的一致性的話,在master上設定ROW模式後,就基本可以保證資料一致了。
- pt-table-checksum雖然很智慧,但還是會對伺服器造成一定的影響,所以一般不會用在master上,除非迫不得已
- 一般檢查資料一致性,我們都會在兩臺slave上進行對比,如果兩臺slave ok,基本就ok了
- 聽說該工具只對statement格式有用,如果是row格式,還能檢查一致性嗎?為什麼?
- 如果是row模式,pt-table-checksum會報錯,但是加上–no-check-binlog-format 即可
- 此工具會自動設定row-format=statement,所以使用者不用擔心。即便設定row,也沒事
- 它是怎麼做到master和slave的記錄對比的,master不是一直再更新嗎?會有鎖嗎?
- 詳細原理,請看上面的原理分析。
- master一直再更新沒錯,但是不會有鎖,利用RR隔離級別的特性就能保證當前事務的資料是不會變的
- RR隔離級別是什麼鬼?為什麼能夠保證當前事務的資料不變呢?
- 可參看之前的分享: SELECT 你知多少
缺陷
- 如果master和slave直接的表結構不一致,目前是沒辦法檢測出來的
* 場景
master:table xx( A int,B char)
slave: table xx( A int)
pt-table-checksum 無法檢測B欄位。。。
重要
- 風險1
這裡設定了SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 直到對比完成,才結束這個session.
那這樣意味什麼呢?意味著如果這個session不結束,這個事務對應的undo一直不會被purge,會導致undo不斷變大,即ibdata會一直變大。
措施:儘量在低峰期執行
- 風險2
這裡是通過RR隔離級別來保證select CRC的值一致的,那麼如果RR被破壞了呢?
沒錯,這樣的對比,很容易被DDL所破壞。
措施:DDL是可以人為控制時間視窗和週期的
相關文章
- GoPlay 原理詳解Go
- GCD 原理詳解GC
- Webpack Tapable原理詳解Web
- Java CAS 原理詳解Java
- CTMediator 原理詳解(一)
- CTMediator 原理詳解(二)
- UIScrollView 原理詳解UIView
- 比特幣原理詳解比特幣
- socket.io 原理詳解
- engine.io 原理詳解
- Go Context 原理詳解GoContext
- 詳解MySQL事務原理MySql
- SpringMVC工作原理詳解SpringMVC
- DNS 查詢原理詳解DNS
- 快速生成樹原理詳解
- Kerberos認證原理詳解ROS
- Flashback Data Archive原理詳解Hive
- 【DG】DG概念原理詳解
- Android Handler原理詳解Android
- Struts2原理詳解
- linux zookeeper 原理詳解Linux
- 詳解 php 反射機制原理PHP反射
- Express中介軟體原理詳解Express
- volatile底層原理詳解
- Seq2Seq原理詳解
- JavaScript物件導向詳解(原理)JavaScript物件
- Tomcat結構原理詳解Tomcat
- Spark RDD使用詳解--RDD原理Spark
- IOS SDWebImage實現原理詳解iOSWeb
- 常見sql注入原理詳解!SQL
- MySQL的InnoDB索引原理詳解MySql索引
- pt-table-checksum 使用實踐
- pt-table-checksum工具應用
- 從原理到應用,Elasticsearch詳解Elasticsearch
- POE 供電裝置原理詳解
- 主成分分析(PCA)原理詳解PCA
- 詳細講解函式呼叫原理函式
- MySQL中count(*)函式原理詳解MySql函式