pt-table-checksum 原理解析
Mysql的復(fù)制是通過傳輸binlog來實(shí)現(xiàn),是一種邏輯復(fù)制,然而這種復(fù)制方式也帶來了主從不一致的風(fēng)險(xiǎn)。因此主從不一致的校驗(yàn)對一個(gè)DBA來說是至關(guān)重要的。percona的pt-table-checksum一直作為主從不一致校驗(yàn)的熱門工具,讓我們現(xiàn)在來一起了解他吧。
pt-table-checksum通過sql在主庫執(zhí)行數(shù)據(jù)塊的校驗(yàn),然后把相同的語句傳送到從庫,并在從庫上計(jì)算數(shù)據(jù)塊的校驗(yàn),最后將主從庫相同塊的校驗(yàn)值進(jìn)行對比,辨別主從不一致。
?
一、事例
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
事例中,本機(jī)用root賬戶登錄登錄端口為3301的數(shù)據(jù)庫,對freedom數(shù)據(jù)庫的a1表進(jìn)行主從一致檢查,每次檢查以100行數(shù)據(jù)為一個(gè)塊。
裝完pt工具后,運(yùn)行其中的pt-table-checksum。
nocheck-replication-filters:不檢查復(fù)制過濾器,建議啟用。后面可以用--databases來指定需要檢查的數(shù)據(jù)庫。
--no-check-binlog-format?: 不檢查復(fù)制的binlog模式,要是binlog模式是ROW,
--replicate校驗(yàn)表
--databases –tables 所需檢查的數(shù)據(jù)庫名和表名
--chunk_size 塊大小定義(即一個(gè)塊包含的行數(shù))
pt-table-checksum –help 查看還有其他安全參數(shù),限速選項(xiàng)(避免主從延遲太大),過濾選項(xiàng)(可以指定表或數(shù)據(jù)庫)
?
二、內(nèi)部工作重要過程
1.??? SET @@binlog_format := 'STATEMENT'
創(chuàng)建校驗(yàn)信息存放表
SET SESSION TRANSACTIONISOLATION LEVEL REPEATABLE READ
查找表的索引列
確定分塊的第一行,和分塊的最后行索引數(shù)值
查出該塊的所有記錄,并且做校驗(yàn),最后插入檢驗(yàn)表
查出主庫校驗(yàn)值和校驗(yàn)行數(shù)更新到校驗(yàn)信息表的master_crc, master_cnt列,執(zhí)行下一個(gè)塊回到步驟5
通過sql命令查出校驗(yàn)表中主從校驗(yàn)不一致的信息。
?
?
詳解:
pt-table-checksum是通過相同sql在主從庫進(jìn)行計(jì)算而校驗(yàn)出來的,所以需要將binlog格式需改成STATEMENT。
3.修改隔離級別,通過加鎖保證在取數(shù)據(jù)行數(shù)(replaceinto select ?from )到計(jì)算出檢驗(yàn)值這段時(shí)間數(shù)據(jù)不會被修改。他采用塊,來減少每次鎖住數(shù)據(jù)的行數(shù),這樣提高了并發(fā)性。
查出分塊區(qū)間。首先判斷是否為第一個(gè)塊,如果是的話查找第一個(gè)索引值,然后根據(jù)第一個(gè)索引值查出該快最后個(gè)索引值。如果不是第一個(gè)塊,根據(jù)上個(gè)塊的最后個(gè)索引值作為標(biāo)準(zhǔn),查出該塊的第一個(gè)索引和最后個(gè)索引。
第1個(gè)塊:
SELECT?id`?FROM?`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?`id`?IS?NOT?NULL?ORDER?BY?`id`?LIMIT1先根據(jù)表a1的主鍵索引排序,然后得到第一個(gè)索引值。
SELECT?/*!40001?SQL_NO_CACHE?*/?`id`?FROM`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?((`id`?>=?'1'))?ORDER?BY?`id`LIMIT?100,?2因?yàn)閴K數(shù)大小為100,查出該塊中最后個(gè)索引值的大小。
第2個(gè)塊:
SELECT?/*!40001?SQL_NO_CACHE?*/?`id`?FROM`freedom`.`a1`?FORCE?INDEX(`PRIMARY`)?WHERE?((`id`?>?'100'))?ORDER?BY?`id`LIMIT?101,?2上個(gè)塊的最后個(gè)索引值為100,查出其后的100個(gè)索引值,得到該快的第一個(gè)索引和最后個(gè)索引。
6.計(jì)算校驗(yàn)值
先根據(jù)該塊的索引區(qū)間,將該塊所有行數(shù)據(jù)進(jìn)行合并然后做校驗(yàn),然后插入檢驗(yàn)表。插入檢驗(yàn)表的信息有,數(shù)據(jù)庫名,表名,塊號,第一個(gè)索引,最后個(gè)索引,塊的行數(shù)以及塊的內(nèi)容。
7. 將主庫的校驗(yàn)值更新到主從校驗(yàn)表。
UPDATE?`test`.`checksum`?SET?chunk_time?='0.002492',?master_crc?=?'d7ac8fcb',?master_cnt?=?'100'?WHERE?db?=?'freedom'AND?tbl?=?'a1'?AND?chunk?=?'1'將主庫的校驗(yàn)值更新到主從校驗(yàn)表。
9. 在從庫檢查主從不同步。
select?*?from?test.checksums?where?master_cnt?<>this_cnt?OR?master_crc?<>?this_crc?OR?ISNULL(master_crc)?<>ISNULL(this_crc)?\G查出檢驗(yàn)位或行數(shù)不同的數(shù)據(jù)
三、性能影響
數(shù)據(jù)庫層面:并發(fā)性上,通過塊來大大減少鎖的影響,從而又能保證數(shù)據(jù)一致性又能保證檢驗(yàn)數(shù)據(jù)的準(zhǔn)確性。主從延遲問題上,因?yàn)?/span>主庫更新可以并發(fā),然而從庫Slave_SQL_Running線程是單線程這種速率差異將會導(dǎo)致一個(gè)時(shí)間段中主從數(shù)據(jù)不一致,這樣將導(dǎo)致檢驗(yàn)數(shù)據(jù)不準(zhǔn)確,主庫執(zhí)行sql檢驗(yàn)語句再通過復(fù)制原理最后從庫再執(zhí)行sql語句,雖然主從執(zhí)行校驗(yàn)的時(shí)間不同但保證了數(shù)據(jù)的一致性。主從不一致過大,也可以通過限速選項(xiàng)來避免。
?? 服務(wù)器層面:從圖表可以看到因?yàn)榇罅坑?jì)算校驗(yàn)值,cpu消耗量較大。可以通過減少塊數(shù)的大小來減輕cpu的負(fù)載,但需要增加處理時(shí)間。IO,每個(gè)塊需要讀操作做一次以及寫操作兩次,對于IO的負(fù)載是比較低的。
| ? ? ? ? ? ? ? ? ? ? ? ?1G數(shù)據(jù) 200W條數(shù)據(jù)量 | |||
| ? ?塊數(shù)大小 | ? ? ? CPU(%) | ? ?IO(%) | ? ?處理時(shí)間(分鐘) |
| ? ?1000 | ?45 | ? ?7 | ? ? 1 |
| ? ? 100 | ? 28 | ? ?7 | ? ? 4 |
四、注意事項(xiàng)
1.從庫配置表上需要加上,
report_host=slave_ip
report_port=slave_port
不然將報(bào)Diffscannot be detected because no slaves were found.錯(cuò)誤
2.表中沒有索引,pt-table-checksum將沒辦法處理
3.表中只有普通索引。當(dāng)數(shù)據(jù)列有重復(fù)并且正好在分塊的交界中,將會報(bào)錯(cuò)。所以表中最好有一個(gè)唯一索引列。
01-07T12:05:29 Error checksumming tablefreedom.a6: Possible infinite loop detected!?The lower boundary for chunk 2 is <cc, cc> and the lower boundaryfor chunk 3 is also <cc, cc>.? 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.塊的定義過大。當(dāng)塊大于表的行數(shù)時(shí),將會產(chǎn)生全表鎖。
轉(zhuǎn)載于:https://blog.51cto.com/10574662/1733788
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的pt-table-checksum 原理解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中的跨进程通信方法实例及特
- 下一篇: OGNL表达式语言中的#和$的区别