mysql checksum原理_pt-table-checksum 原理解析
Mysql的復制是通過傳輸binlog來實現,是一種邏輯復制,然而這種復制方式也帶來了主從不一致的風險。因此主從不一致的校驗對一個DBA來說是至關重要的。percona的pt-table-checksum一直作為主從不一致校驗的熱門工具,讓我們現在來一起了解他吧。
pt-table-checksum通過sql在主庫執行數據塊的校驗,然后把相同的語句傳送到從庫,并在從庫上計算數據塊的校驗,最后將主從庫相同塊的校驗值進行對比,辨別主從不一致。
一、事例
pt-table-checksum --nocheck-replication-filters--no-check-binlog-format --replicate=test.checksum --databases=freedomh=127.0.0.1,u=root,P=3301? --tables=a1--chunk_size=100
事例中,本機用root賬戶登錄登錄端口為3301的數據庫,對freedom數據庫的a1表進行主從一致檢查,每次檢查以100行數據為一個塊。
裝完pt工具后,運行其中的pt-table-checksum。
nocheck-replication-filters:不檢查復制過濾器,建議啟用。后面可以用--databases來指定需要檢查的數據庫。
--no-check-binlog-format?:不檢查復制的binlog模式,要是binlog模式是ROW,
--replicate校驗表
--databases –tables所需檢查的數據庫名和表名
--chunk_size塊大小定義(即一個塊包含的行數)
pt-table-checksum –help查看還有其他安全參數,限速選項(避免主從延遲太大),過濾選項(可以指定表或數據庫)
二、內部工作重要過程1.SET @@binlog_format := 'STATEMENT'
創建校驗信息存放表
SET SESSION TRANSACTIONISOLATION LEVEL REPEATABLE READ
查找表的索引列
確定分塊的第一行,和分塊的最后行索引數值
查出該塊的所有記錄,并且做校驗,最后插入檢驗表
查出主庫校驗值和校驗行數更新到校驗信息表的master_crc, master_cnt列,執行下一個塊回到步驟5
通過sql命令查出校驗表中主從校驗不一致的信息。
詳解:pt-table-checksum是通過相同sql在主從庫進行計算而校驗出來的,所以需要將binlog格式需改成STATEMENT。
3.修改隔離級別,通過加鎖保證在取數據行數(replaceinto select ?from)到計算出檢驗值這段時間數據不會被修改。他采用塊,來減少每次鎖住數據的行數,這樣提高了并發性。
查出分塊區間。首先判斷是否為第一個塊,如果是的話查找第一個索引值,然后根據第一個索引值查出該快最后個索引值。如果不是第一個塊,根據上個塊的最后個索引值作為標準,查出該塊的第一個索引和最后個索引。
第1個塊:SELECT?id`?FROM?`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?`id`?IS?NOT?NULL?ORDER?BY?`id`?LIMIT1
先根據表a1的主鍵索引排序,然后得到第一個索引值。SELECT?/*!40001?SQL_NO_CACHE?*/?`id`?FROM`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?((`id`?>=?'1'))?ORDER?BY?`id`LIMIT?100,?2
因為塊數大小為100,查出該塊中最后個索引值的大小。
第2個塊:SELECT?/*!40001?SQL_NO_CACHE?*/?`id`?FROM`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?((`id`?>?'100'))?ORDER?BY?`id`LIMIT?101,?2
上個塊的最后個索引值為100,查出其后的100個索引值,得到該快的第一個索引和最后個索引。
6.計算校驗值
先根據該塊的索引區間,將該塊所有行數據進行合并然后做校驗,然后插入檢驗表。插入檢驗表的信息有,數據庫名,表名,塊號,第一個索引,最后個索引,塊的行數以及塊的內容。
7. 將主庫的校驗值更新到主從校驗表。UPDATE?`test`.`checksum`?SET?chunk_time?='0.002492',?master_crc?=?'d7ac8fcb',?master_cnt?=?'100'?WHERE?db?=?'freedom'AND?tbl?=?'a1'?AND?chunk?=?'1'
將主庫的校驗值更新到主從校驗表。
9. 在從庫檢查主從不同步。select?*?from?test.checksums?where?master_cnt?<>this_cnt?OR?master_crc?<>?this_crc?OR?ISNULL(master_crc)?<>ISNULL(this_crc)?\G
查出檢驗位或行數不同的數據
三、性能影響
數據庫層面:并發性上,通過塊來大大減少鎖的影響,從而又能保證數據一致性又能保證檢驗數據的準確性。主從延遲問題上,因為主庫更新可以并發,然而從庫Slave_SQL_Running線程是單線程這種速率差異將會導致一個時間段中主從數據不一致,這樣將導致檢驗數據不準確,主庫執行sql檢驗語句再通過復制原理最后從庫再執行sql語句,雖然主從執行校驗的時間不同但保證了數據的一致性。主從不一致過大,也可以通過限速選項來避免。
服務器層面:從圖表可以看到因為大量計算校驗值,cpu消耗量較大。可以通過減少塊數的大小來減輕cpu的負載,但需要增加處理時間。IO,每個塊需要讀操作做一次以及寫操作兩次,對于IO的負載是比較低的。1G數據200W條數據量
塊數大小CPU(%)IO(%)處理時間(分鐘)
10004571
1002874
四、注意事項
1.從庫配置表上需要加上,
report_host=slave_ipreport_port=slave_port
不然將報Diffscannot be detected because no slaves were found.錯誤
2.表中沒有索引,pt-table-checksum將沒辦法處理
3.表中只有普通索引。當數據列有重復并且正好在分塊的交界中,將會報錯。所以表中最好有一個唯一索引列。
01-07T12:05:29 Error checksumming tablefreedom.a6: Possible infinite loop detected!?The lower boundary for chunk 2 is and the lower boundaryfor chunk 3 is also .? Thisusually happens when using a non-unique single column index.? The current chunk index for table freedom.a6is name which is not unique and covers 1 colum
4.塊的定義過大。當塊大于表的行數時,將會產生全表鎖。
總結
以上是生活随笔為你收集整理的mysql checksum原理_pt-table-checksum 原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉特仓库管理系统-.NET打印问题总结
- 下一篇: cesium加载GeoJSON