pt-table-checksum和pt-table-sync使用

pt-table-checksum和pt-table-sync使用

數據庫版本:5.6.25算法

pt工具版本:2.2.14sql

主從關係一:不一樣機器同一端口數據庫

10.10.228.163:4306rescs5)服務器

10.9.33.154     :  4306   rescs6)ide

主從關係二:同一機器不一樣端口函數

10.10.228.163:3306rescs5)工具

10.10.228.163 :  3307   rescs5)測試

 

pt-table-checksum原理this

1)、單行數據checksum值的計算spa

Pt工具先檢查表的結構,而且獲取表中每一列的數據類型,把全部數據類型都轉化爲字符串,而後使用concat_ws()函數進行鏈接,而後使用crc32計算出該行的checksum值。

2)、數據塊checksum值的計算

若是一行一行去計算checksum值,再去和從庫比較,效率會很低。pt-table-checksum能夠利用表中的索引,將表的數據split成一個個chunk,計算的時候也是以chunk爲單位。pt-table-checksum引入了聚合函數BIT_XOR()。它的功能能夠理解爲將這個chunk內的全部行數據拼接起來,再計算CRC32的值,就獲得了這個chunk的checksum值。

3)、pt-table-checksum經過在主服務器上執行檢查語句,在線檢查MySQL複製的一致性,生成replace語句,而後傳遞到從服務器,再經過update更新master_src的值。經過檢測從服務器的this_src和master_src的值從而判斷複製是否一致。

 

爲了方便測試,在主庫上執行添加用戶操做

grant all on *.* to 'ptuser'@'%' identified by 'ptuser';

1)、主從在不一樣機器同一端口下,在主庫上執行

pt-table-checksum --recursion-method="processlist" --nocheck-binlog-format --nocheck-replication-filters --replicate=test.checksums --databases=bukexuetang  h=10.10.228.163,u=ptuser,p=ptuser,P=4306

 

在從庫上刪除幾條記錄

delete from activity where id > 100 and id < 120;

再次運行pt-table-checksum

pt-table-checksum --recursion-method="processlist" --nocheck-binlog-format --nocheck-replication-filters --replicate=test.checksums --databases=bukexuetang h=10.10.228.163,u=ptuser,p=ptuser,P=4306

 

經過DIFFS是1就能夠看出主從的表數據不一致。怎麼不一致呢? 經過指定–replicate=test.checksums參數,就說明把檢查信息都寫到了checksums表中

 

2)、主從在同一機器不一樣端口下,在主庫上執行

create database percona;
use percona;
CREATE TABLE `slave` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into slave(`id`,`dsn`) values(1,'h=10.10.228.163,P=3307');

pt-table-checksum --recursion-method=dsn=D=percona,t=slave --nocheck-binlog-format --nocheck-replication-filters --replicate=test.checksums --databases=bukexuetang h=10.10.228.163,u=ptuser,p=ptuser,P=3306

 

在從庫上刪除幾條記錄

delete from activity where id > 100 and id < 120;

再次運行pt-table-checksum

pt-table-checksum --recursion-method=dsn=D=percona,t=slave --nocheck-binlog-format --nocheck-replication-filters --replicate=test.checksums --databases=bukexuetang h=10.10.228.163,u=ptuser,p=ptuser,P=3306

 

命令參數解釋:

--nocheck-replication-filters : 不檢查複製過濾規則(replicate-ignore-db、replicate-wild-do-table)。另外須要特別注意執行checksum所在的數據庫必須是同步的數據庫;

--nocheck-binlog-format:不檢查複製的binlog模式。若是binlog模式爲ROW,則須要啓用—no-check-binlog-format,不然會報錯;

--databases=bukexuetang:指定要checksum的數據庫;

--replicate=test.checksums:存放checksum結果的表;

--recursion-method : 用來決定查找slave的方式是show full processlist仍是show slave hosts仍是命令行直接指定仍是壓根就不許備找從庫。若是主庫從庫使用的是相同端口,那麼--recursion-method默認值爲processlist,若是主庫從庫使用了非默認端口,建議經過dsn指定從庫信息。dsn即DATA SOURCE NAME,數據源名稱;

 

pt-table-sync原理

用來修復多個實例之間數據的不一致,它可讓主從的數據修復到最終一致。

1)、單行數據checksum值的計算

pt-table-checksum同樣,也是先檢查表結構,並獲取每一列的數據類型,把全部數據類型都轉化爲字符串,而後用concat_ws()函數進行鏈接,由此計算出該行的checksum值。Checksum默認採用crc32計算。

2)、數據塊checksum值的計算

pt-table-checksum工具同樣,pt-table-sync會將表的數據split成若干個chunk,計算的時候以chunk爲單位。能夠理解爲將chunk內的全部行的數據拼接起來,再計算crc32的值,既能夠獲得該chunk的checksum值。

3)、數據修復

pt-table-sync與pt-table-checksum的算法和原理是同樣的。再往下,就開始有所不一樣了:pt-table-checksum只是校驗,它把checksum結果存儲到統計表,而後把執行過的sql語句記錄到binlog,任務就算完成。語句級的複製把計算

邏輯傳遞到從庫,而且在從庫執行相同的計算。pt-table-sync則不一樣,它首先要完成chunk的checksum值計算,一旦發現主從上相同的chunk的checksum值不同,就會深刻到該chunk內部,逐行比較而且修復有問題的行。

它的計算邏輯描述以下:
1)、對每個從庫,每個表,循環進行以下校驗和修復過程。
2)、對每個chunk,校驗時加上for update鎖。一旦得到鎖,就記錄下當前主庫的show master status值。
3)、在從庫上執行select master_pos_wait()函數,等待從庫的sql線程執行到show master status獲得位置。以此保證,主從上關於這個chunk的內容再也不改變。【select master_pos_wait('master_log_file','master_log_pos');該函數會阻塞直到從服務器達到指定的日誌文件和偏移量。此時從服務器和主服務器就同步了,語句返回值爲0】.
4)、對這個chunk執行checksum計算,而後與主庫的checksum進行比較。
5)、若是checksum相同,說明主從數據一致,接着就能夠繼續下一個chunk。
6)、若是checksum值不一樣,說明該chunk有不一致。就會深刻到chunk內部,逐行計算checksum並比較(單行checksum的比較過程與chunk的比較過程同樣,單行實際是chunk的size等於1的特例)。
7)、若是發現某行不一致,則標記下來。繼續檢測剩餘行,直到這個chunk結束。
8)、對找到的主從不一致的行,採用replace into語句,在主庫上執行一遍以生成該行全量的binlog, 並同步到從庫,這就會以主庫數據爲基準來修復從庫;對於主庫有的,而從庫沒有的行,採用replace into在主庫上插入(注意,不能是insert。這分爲兩種狀況:一是有惟一性主鍵,若是有惟一性主鍵或者索引,則insert相同記錄會在主庫上插入失敗;二是沒有惟一性主鍵或者索引,insert相同記錄會形成記錄重複。故要求pt-table-sync的表必需要有惟一性主鍵或者索引)。
9)、直到修復該chunk全部不一致的行。繼續檢查和修復下一個chunk。
10)、直到這個從庫上的全部表修復結束。接着繼續修復下一個從庫。

注意事項:

1)pt-table-checksum工具檢查的表能夠沒有主鍵或者惟一索引。

2)pt-table-sync工具修復表的時候,表必須有主鍵或者惟一索引。

3)兩個工具在運行的過程當中,都會產生對於chunk行塊的寫鎖和必定的負載。因此你們儘可能採用腳本的方式在業務低峯期進行。

 

在從庫上刪除幾條記錄
delete from ability_info where id < 120;

從庫執行,將不一致的數據打印出來

pt-table-sync --print --sync-to-master h=10.9.33.154,u=ptuser,p=ptuser,P=4306,D=bukexuetang,t=ability_info --charset=utf8

 

pt-table-sync --print --sync-to-master h=10.10.228.163,u=ptuser,p=ptuser,P=3307,D=bukexuetang,t=activity --charset=utf8

 

從庫執行,修復不一致的數據

pt-table-sync --execute --sync-to-master h=10.9.33.154,u=ptuser,p=ptuser,P=4306,D=bukexuetang,t=ability_info --charset=utf8

pt-table-sync --execute --sync-to-master h=10.10.228.163,u=ptuser,p=ptuser,P=3307,D=bukexuetang,t=activity --charset=utf8

從庫執行,將不一致的數據打印出來

pt-table-sync --print --sync-to-master h=10.9.33.154,u=ptuser,p=ptuser,P=4306,D=bukexuetang,t=ability_info --charset=utf8

pt-table-sync --print --sync-to-master h=10.10.228.163,u=ptuser,p=ptuser,P=3307,D=bukexuetang,t=activity --charset=utf8

pt-table-sync --print --sync-to-master h=10.9.33.154,u=ptuser,p=ptuser,P=4306 --databases bukexuetang --charset=utf8

pt-table-sync --print --sync-to-master h=10.10.228.163,u=ptuser,p=ptuser,P=3307 --databases bukexuetang --charset=utf8

命令參數解釋:

--databases : 指定執行同步的數據庫,多個用逗號隔開。

--tables : 指定執行同步的表,多個用逗號隔開。

--sync-to-master : 指定一個DSN,即從的IP,他會經過show processlist或show slave status 去自動的找主。

--print : 打印,但不執行命令。

--execute : 執行命令。

--charset : 指定字符集

注意事項:

pt-table-sync後面接的h=xxx.xxx.xxx.xxx是從庫的IP和端口,並非主庫

必定要顯式指定字符集--charset=utf8

 

坑的地方,校驗完後客戶端字符集被設置成了latin1

 

顯式設置客戶端字符集set names utf8;

 

 

相關文章
相關標籤/搜索