mysql checksum原理_pt-table-checksum 原理解析
Mysql的復(fù)制是通過傳輸binlog來實(shí)現(xiàn),是一種邏輯復(fù)制,然而這種復(fù)制方式也帶來了主從不一致的風(fēng)險(xiǎn)。因此主從不一致的校驗(yàn)對(duì)一個(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)行對(duì)比,辨別主從不一致。
一、事例
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ù)庫,對(duì)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.修改隔離級(jí)別,通過加鎖保證在取數(shù)據(jù)行數(shù)(replaceinto select ?from)到計(jì)算出檢驗(yàn)值這段時(shí)間數(shù)據(jù)不會(huì)被修改。他采用塊,來減少每次鎖住數(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ù)庫名,表名,塊號(hào),第一個(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)橹鲙旄驴梢圆l(fā),然而從庫Slave_SQL_Running線程是單線程這種速率差異將會(huì)導(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è)塊需要讀操作做一次以及寫操作兩次,對(duì)于IO的負(fù)載是比較低的。1G數(shù)據(jù)200W條數(shù)據(jù)量
塊數(shù)大小CPU(%)IO(%)處理時(shí)間(分鐘)
10004571
1002874
四、注意事項(xiàng)
1.從庫配置表上需要加上,
report_host=slave_ipreport_port=slave_port
不然將報(bào)Diffscannot be detected because no slaves were found.錯(cuò)誤
2.表中沒有索引,pt-table-checksum將沒辦法處理
3.表中只有普通索引。當(dāng)數(shù)據(jù)列有重復(fù)并且正好在分塊的交界中,將會(huì)報(bào)錯(cuò)。所以表中最好有一個(gè)唯一索引列。
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.塊的定義過大。當(dāng)塊大于表的行數(shù)時(shí),將會(huì)產(chǎn)生全表鎖。
總結(jié)
以上是生活随笔為你收集整理的mysql checksum原理_pt-table-checksum 原理解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉特仓库管理系统-.NET打印问题总结
- 下一篇: mysql resultmap_MySQ