架構
主:172.17.100.80
從:172.17.100.104
sysbench:172.17.100.100
MySQL版本:5.7.24
首先完成主從的搭建
參考文檔:基于GTID的主從搭建
sysbench創(chuàng)建數(shù)據(jù)到主庫
參考文檔:sysbench安裝及使用
Percona組件的部署
yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install -y percona-toolkit
驗證Percona組件部署是否正常
pt-query-digest --help
pt-heartbeat測試復制延遲
#搭建配置
主庫創(chuàng)建數(shù)據(jù)庫pt(自動同步到從庫距帅,從庫無需創(chuàng)建)
create database pt;
在搭建pt組件的機器上執(zhí)行
pt-heartbeat -D pt --update -uroot -p密碼 -P主庫端口 -h主庫IP --create-table --daemonize
創(chuàng)建完成后,在pt庫里會有一張heartbeat表
#查看復制延遲的執(zhí)行
pt-heartbeat -D pt --monitor -uroot -p密碼 -P從庫端口 -h從庫IP
如果把monitor改成check,會只刷新一次
(監(jiān)控復制延遲效果如下赚抡,這是一個sysbench導入時的復制延遲監(jiān)控)
以下圖第一行為例河狐,意思是
延遲時間:當前364秒【334.5秒(1分內平均),214.5秒(5分內平均)积糯,73.83秒(15分內平均)】
pt-table-checksum
主庫:172.17.100.80
從庫:172.17.100.104
Percona組件部署IP:172.17.100.104
到主庫執(zhí)行
GRANT SELECT, DELETE,INSERT,UPDATE, CREATE, DROP, PROCESS, INDEX, SUPER, EXECUTE, REPLICATION SLAVE ON *.* TO ptsum@'%' identified by 'ptsum';
GRANT SELECT, DELETE,INSERT,UPDATE, CREATE, DROP, PROCESS, INDEX, SUPER, EXECUTE, REPLICATION SLAVE ON *.* TO ptsum@localhost identified by 'ptsum';
反正開啟了主從同步跌帐,這玩意也會自己同步到從庫的
老版本的checksum需要自己去建表,新版本則不需要手動建表了翎冲,我這里是新版本垂睬,不存在手動建表的操作
#到部署有Percona組件的機器上執(zhí)行
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=需要檢測一致性的庫 --no-check-binlog-format h=主庫IP,u=ptsum,p=主庫密碼,P=主庫端口
說明一下上面這條語句
--replicate=test.checksums? ? ?test.checksums表就是我們前面說的新版本自動創(chuàng)建的表,確保別建在業(yè)務庫下就行府适,test庫要存在羔飞;這張表會用來存放每次校對之后的結果,有參數(shù)可以選擇在校對之前清空這張表檐春,具體的不在這里討論
--databases=需要檢測一致性的庫? 比如我要比對主從的sbtest庫是否一致逻淌,則--databases=sbtest
--no-check-binlog-format? 該參數(shù)必須寫上,默認是statement疟暖,但生產(chǎn)庫通常是row格式
前面的語句執(zhí)行結果如下(紅框處為0卡儒,表示數(shù)據(jù)一致)
關于DSN
如果主庫端口和從庫端口不同;或者一個主庫有非常多的從庫俐巴;這種時候很可能出現(xiàn)checksum在連入到主庫之后根本無法找到從庫的情況骨望,這時候就需要添加一條路由來指引從庫了,這也就是DSN
登錄主庫欣舵,仍然使用test庫擎鸠,創(chuàng)建一張dsn表
use test;
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`));
insert into dsns values(1,1,'h=slave的IP,u=ptsum,p=ptsum,P=從庫端口');
#到部署有Percona組件的機器上執(zhí)行
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=sbtest --no-check-binlog-format h=主庫IP,u=ptsum,p=ptsum,P=主庫端口 --recursion-method dsn=t=test.dsns,h=從庫IP,u=ptsum,p=ptsum,P=從庫端口
上面那條語句的意思就是用pt登錄到主庫上,通過讀取主庫dsn里面的路由關系去找到從庫缘圈,然后進行一致性校驗
如果pt在主庫上有部署劣光,那么加粗斜體部分的主庫ip等內容是可以不寫的,但u和p要寫出來糟把,否則會以root方式去登陸mysql
--recursion-method這個參數(shù)就表示會以dsn去尋找從庫了绢涡,后面需要跟上dsn的相關參數(shù)
執(zhí)行效果如下
pt-table-sync
從庫上執(zhí)行操作
delete from sbtest1 limit 10;
此時主庫和從庫的sbtest1表相差10行數(shù)據(jù)
通過checksum查看
#根據(jù)檢查生成的test.checksums進行數(shù)據(jù)的快速恢復
pt-table-sync --execute h=主庫IP,u=root,p=主庫密碼 --replicate test.checksums 主庫hostname
(本來想著主庫的test.checksums也會同步到從庫上,上面的語句試了下h=從庫IP遣疯,執(zhí)行倒是不報錯雄可,但數(shù)據(jù)沒有恢復成功)
執(zhí)行完成后,刪掉的10條數(shù)據(jù)被補全
#如果沒有經(jīng)過checksum缠犀,直接同步2個庫中某個表数苫,則采用下列語句
pt-table-sync --execute h=主庫IP,D=sbtest,t=sbtest1,u=root,p=主庫密碼 h=從庫IP,u=root,p=從庫密碼 --no-check-slave
pt-osc
待續(xù)...