日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

pt-table-checksum 原理解析

發(fā)布時(shí)間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pt-table-checksum 原理解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Mysql的復(fù)制是通過(guò)傳輸binlog來(lái)實(shí)現(xiàn),是一種邏輯復(fù)制,然而這種復(fù)制方式也帶來(lái)了主從不一致的風(fēng)險(xiǎn)。因此主從不一致的校驗(yàn)對(duì)一個(gè)DBA來(lái)說(shuō)是至關(guān)重要的。perconapt-table-checksum一直作為主從不一致校驗(yàn)的熱門工具,讓我們現(xiàn)在來(lái)一起了解他吧。

pt-table-checksum通過(guò)sql在主庫(kù)執(zhí)行數(shù)據(jù)塊的校驗(yàn),然后把相同的語(yǔ)句傳送到從庫(kù),并在從庫(kù)上計(jì)算數(shù)據(jù)塊的校驗(yàn),最后將主從庫(kù)相同塊的校驗(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ù)庫(kù),對(duì)freedom數(shù)據(jù)庫(kù)的a1表進(jìn)行主從一致檢查,每次檢查以100行數(shù)據(jù)為一個(gè)塊。

裝完pt工具后,運(yùn)行其中的pt-table-checksum

nocheck-replication-filters:不檢查復(fù)制過(guò)濾器,建議啟用。后面可以用--databases來(lái)指定需要檢查的數(shù)據(jù)庫(kù)。

--no-check-binlog-format?: 不檢查復(fù)制的binlog模式,要是binlog模式是ROW

--replicate校驗(yàn)表

--databases –tables 所需檢查的數(shù)據(jù)庫(kù)名和表名

--chunk_size 塊大小定義(即一個(gè)塊包含的行數(shù))

pt-table-checksum –help 查看還有其他安全參數(shù),限速選項(xiàng)(避免主從延遲太大),過(guò)濾選項(xiàng)(可以指定表或數(shù)據(jù)庫(kù))

?

二、內(nèi)部工作重要過(guò)程

  • 1.??? SET @@binlog_format := 'STATEMENT'

  • 創(chuàng)建校驗(yàn)信息存放表

  • SET SESSION TRANSACTIONISOLATION LEVEL REPEATABLE READ

  • 查找表的索引列

  • 確定分塊的第一行,和分塊的最后行索引數(shù)值

  • 查出該塊的所有記錄,并且做校驗(yàn),最后插入檢驗(yàn)表

  • 查出主庫(kù)校驗(yàn)值和校驗(yàn)行數(shù)更新到校驗(yàn)信息表的master_crc, master_cnt列,執(zhí)行下一個(gè)塊回到步驟5

  • 通過(guò)sql命令查出校驗(yàn)表中主從校驗(yàn)不一致的信息。

  • ?

    ?

    詳解:

  • pt-table-checksum通過(guò)相同sql在主從庫(kù)進(jìn)行計(jì)算而校驗(yàn)出來(lái)的,所以需要將binlog格式需改成STATEMENT

  • 3.修改隔離級(jí)別,通過(guò)加鎖保證在取數(shù)據(jù)行數(shù)(replaceinto select ?from )到計(jì)算出檢驗(yàn)值這段時(shí)間數(shù)據(jù)不會(huì)被修改。他采用塊,來(lái)減少每次鎖住數(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ù)庫(kù)名,表名,塊號(hào),第一個(gè)索引,最后個(gè)索引,塊的行數(shù)以及塊的內(nèi)容。

    7. 將主庫(kù)的校驗(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'

    將主庫(kù)的校驗(yàn)值更新到主從校驗(yàn)表。

    9. 在從庫(kù)檢查主從不同步。

    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ù)庫(kù)層面:并發(fā)性上,通過(guò)塊來(lái)大大減少鎖的影響,從而又能保證數(shù)據(jù)一致性又能保證檢驗(yàn)數(shù)據(jù)的準(zhǔn)確性。主從延遲問(wèn)題上,因?yàn)?/span>主庫(kù)更新可以并發(fā),然而從庫(kù)Slave_SQL_Running線程是單線程這種速率差異將會(huì)導(dǎo)致一個(gè)時(shí)間段中主從數(shù)據(jù)不一致,這樣將導(dǎo)致檢驗(yàn)數(shù)據(jù)不準(zhǔn)確,主庫(kù)執(zhí)行sql檢驗(yàn)語(yǔ)句再通過(guò)復(fù)制原理最后從庫(kù)再執(zhí)行sql語(yǔ)句,雖然主從執(zhí)行校驗(yàn)的時(shí)間不同但保證了數(shù)據(jù)的一致性。主從不一致過(guò)大,也可以通過(guò)限速選項(xiàng)來(lái)避免。

    ?? 服務(wù)器層面:從圖表可以看到因?yàn)榇罅坑?jì)算校驗(yàn)值,cpu消耗量較大。可以通過(guò)減少塊數(shù)的大小來(lái)減輕cpu的負(fù)載,但需要增加處理時(shí)間IO,每個(gè)塊需要讀操作做一次以及寫操作兩次,對(duì)于IO的負(fù)載是比較低的。

    ? ? ? ? ? ? ? ? ? ? ? ?1G數(shù)據(jù) 200W條數(shù)據(jù)量
    ? ?塊數(shù)大小? ? ? CPU(%)? ?IO(%)? ?處理時(shí)間(分鐘)
    ? ?1000?45
    ? ?7
    ? ? 1
    ? ? 100? 28? ?7? ? 4


    四、注意事項(xiàng)

    1.從庫(kù)配置表上需要加上,

    report_host=slave_ip
    report_port=slave_port

    不然將報(bào)Diffscannot be detected because no slaves were found.錯(cuò)誤

    2.表中沒(méi)有索引,pt-table-checksum將沒(méi)辦法處理

    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 <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.塊的定義過(guò)大。當(dāng)塊大于表的行數(shù)時(shí),將會(huì)產(chǎn)生全表鎖。


    轉(zhuǎn)載于:https://blog.51cto.com/10574662/1733788

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的pt-table-checksum 原理解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。