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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql checksum原理_pt-table-checksum 原理解析

發布時間:2024/3/24 数据库 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。