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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

利用mk-table-checksum监测Mysql主从数据一致性操作记录

發(fā)布時(shí)間:2025/6/17 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用mk-table-checksum监测Mysql主从数据一致性操作记录 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

前面已經(jīng)提到了mysql主從環(huán)境下數(shù)據(jù)一致性檢查:mysql主從同步(3)-percona-toolkit工具(數(shù)據(jù)一致性監(jiān)測(cè)、延遲監(jiān)控)使用梳理
今天這里再介紹另一種Mysql數(shù)據(jù)一致性自動(dòng)檢測(cè)工具:Maatkit。(不過(guò)Maatkit工具現(xiàn)在已經(jīng)不維護(hù)了,推薦還是使用percona-toolkit工具吧!)

Maatkit是一個(gè)開(kāi)源的工具包,為mySQL日常管理提供了幫助,它包含很多工具,這里主要說(shuō)下面兩個(gè):
1)mk-table-checksum ? ? ? ? ? ? ? ? ? ? 用來(lái)檢測(cè)master和slave上的表結(jié)構(gòu)和數(shù)據(jù)是否一致的;
2)mk-table-sync ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在主從數(shù)據(jù)不一致時(shí),用來(lái)修復(fù)數(shù)據(jù)的;先主后從有效保證表一致的工具,不必重載從表而能夠保證一致。
上面兩個(gè)perl腳本在運(yùn)行時(shí)都會(huì)鎖表,表的大小取決于執(zhí)行的快慢,勿在高峰期間運(yùn)行,可選擇凌晨。
-----------------------------------------------------------------------------------------------------

下面記錄了這一操作過(guò)程:
基本信息:
master:192.168.1.101
slave:192.168.1.102
版本:mysql5.6
同步的庫(kù):huanqiu、huanpc

Maatkit安裝過(guò)程:(主庫(kù)和從庫(kù)服務(wù)器上都可以安裝,因?yàn)閿?shù)據(jù)一致性檢查操作在主庫(kù)或從庫(kù)機(jī)器上都可以運(yùn)行;建議主從機(jī)器上都安裝)
1)安裝該工具依賴的軟件包
[root@master-server src]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y

2)maatkit下載安裝 ? ?[需要翻墻到官網(wǎng)下載:https://code.google.com/archive/p/maatkit/downloads]
百度云盤下載地址:https://pan.baidu.com/s/1c1AufW8 ? ?(提取密碼:vbi1
[root@master-server ~]# tar -zvxf maatkit-7540.tar.gz ?&&?cd maatkit-7540?
[root@master-server maatkit-7540]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for maatkit
------------------------------------------------------------------------------------------------------------
如有報(bào)錯(cuò):
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 1.
BEGIN failed--compilation aborted at Makefile.PL line 1.
解決辦法:
[root@slave-server maatkit-4334]# yum install perl-ExtUtils-Embed perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker?-y
------------------------------------------------------------------------------------------------------------
[root@master-server maatkit-4334]# make && make install

[root@master-server ~]# mk- ? ? ? ? ? ? ? //按TAB鍵補(bǔ)全,可以查看到Maatkit的所有命令

mk-archiver mk-find mk-parallel-dump mk-show-grants mk-table-sync mk-checksum-filter mk-heartbeat mk-parallel-restore mk-slave-delay mk-table-usage mk-config-diff mk-index-usage mk-profile-compact mk-slave-find mk-tcp-model mk-deadlock-logger mk-kill mk-purge-logs mk-slave-move mk-upgrade mk-duplicate-key-checker mk-loadavg mk-query-advisor mk-slave-prefetch mk-variable-advisor mk-error-log mk-log-player mk-query-digest mk-slave-restart mk-visual-explain mk-fifo-split mk-merge-mqd-results mk-query-profiler mk-table-checksum

安裝完成后,一定要在被校驗(yàn)的主從服務(wù)器上創(chuàng)建只有SELECT權(quán)限的帳號(hào)(最好保持主從上創(chuàng)建的賬號(hào)和密碼一樣,方便操作

mysql> GRANT SELECT ON *.* TO 'data_check'@'%' IDENTIFIED BY 'check@123'; Query OK, 0 rows affected (0.01 sec)mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)

使用mk-table-checksum檢查主從數(shù)據(jù)一致性
1)在主庫(kù)服務(wù)器上運(yùn)行數(shù)據(jù)一致性檢查操作(也可以在從庫(kù)服務(wù)器上進(jìn)行數(shù)據(jù)一致性檢查操作,命令跟下面一樣)
[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=data_check,p=check@123,P=3306

DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG mysql columns_priv 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql columns_priv 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql db 0 192.168.1.101 MyISAM NULL 4197331717 0 0 NULL NULL mysql db 0 192.168.1.102 MyISAM NULL 4197331717 0 0 NULL NULL mysql event 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql event 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql func 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql func 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql general_log 0 192.168.1.101 CSV NULL 0 0 0 NULL NULL mysql general_log 0 192.168.1.102 CSV NULL 0 0 0 NULL NULL mysql help_category 0 192.168.1.101 MyISAM NULL 2621154011 0 0 NULL NULL mysql help_category 0 192.168.1.102 MyISAM NULL 2621154011 0 0 NULL NULL mysql help_keyword 0 192.168.1.101 MyISAM NULL 2791798352 0 0 NULL NULL mysql help_keyword 0 192.168.1.102 MyISAM NULL 578891347 0 0 NULL NULL mysql help_relation 0 192.168.1.101 MyISAM NULL 3733405838 0 0 NULL NULL mysql help_relation 0 192.168.1.102 MyISAM NULL 1649042165 0 0 NULL NULL mysql help_topic 0 192.168.1.101 MyISAM NULL 1795841156 0 0 NULL NULL mysql help_topic 0 192.168.1.102 MyISAM NULL 2642710534 0 0 NULL NULL mysql innodb_index_stats 0 192.168.1.101 InnoDB NULL 1853713685 0 0 NULL NULL mysql innodb_index_stats 0 192.168.1.102 InnoDB NULL 213249811 0 0 NULL NULL mysql innodb_table_stats 0 192.168.1.101 InnoDB NULL 2028951538 0 0 NULL NULL mysql innodb_table_stats 0 192.168.1.102 InnoDB NULL 4163315044 0 0 NULL NULL mysql ndb_binlog_index 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql ndb_binlog_index 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql plugin 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql plugin 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql proc 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql proc 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql procs_priv 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql procs_priv 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql proxies_priv 0 192.168.1.101 MyISAM NULL 3956276869 0 0 NULL NULL mysql proxies_priv 0 192.168.1.102 MyISAM NULL 2040113179 0 0 NULL NULL mysql servers 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql servers 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql slave_master_info 0 192.168.1.101 InnoDB NULL 0 0 0 NULL NULL mysql slave_master_info 0 192.168.1.102 InnoDB NULL 0 0 0 NULL NULL mysql slave_relay_log_info 0 192.168.1.101 InnoDB NULL 0 0 0 NULL NULL mysql slave_relay_log_info 0 192.168.1.102 InnoDB NULL 0 0 0 NULL NULL mysql slave_worker_info 0 192.168.1.101 InnoDB NULL 0 0 0 NULL NULL mysql slave_worker_info 0 192.168.1.102 InnoDB NULL 0 0 0 NULL NULL mysql slow_log 0 192.168.1.101 CSV NULL 0 0 0 NULL NULL mysql slow_log 0 192.168.1.102 CSV NULL 0 0 0 NULL NULL mysql tables_priv 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql tables_priv 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql time_zone 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql time_zone 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_leap_second 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_leap_second 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_name 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_name 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_transition 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_transition 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_transition_type 0 192.168.1.101 MyISAM NULL 0 0 0 NULL NULL mysql time_zone_transition_type 0 192.168.1.102 MyISAM NULL 0 0 0 NULL NULL mysql user 0 192.168.1.101 MyISAM NULL 882367917 0 0 NULL NULL mysql user 0 192.168.1.102 MyISAM NULL 883514797 0 0 NULL NULL DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanqiu checksums 0 192.168.1.101 InnoDB NULL 1230819712 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB NULL 3864574229 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB NULL 1378115040 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB NULL 1378115040 0 0 NULL NULL DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanpc checksums 0 192.168.1.101 InnoDB NULL 2427682155 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB NULL 289696409 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB NULL 1446184115 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB NULL 1956266704 0 0 NULL NULL

上面命令中參數(shù)解釋:
第一個(gè)h: ? 填寫(xiě)主庫(kù)ip
第一個(gè)u: ? 主庫(kù)授權(quán)的用戶名
第一個(gè)p: ? 主庫(kù)授權(quán)的密碼
第二個(gè)h: ? 填寫(xiě)從庫(kù)ip
第二個(gè)u: ? 從庫(kù)授權(quán)的用戶名
第二個(gè)p: ? 從庫(kù)授權(quán)的密碼
P: ? mysql的端口

上面的命令所示檢查主從的所有庫(kù)的數(shù)據(jù)一致性;一般我們檢查的是同步的庫(kù)。這就需要添加參數(shù):
-d(或者--database)? ? 后接數(shù)據(jù)庫(kù)名,注意后面不需要加=號(hào),多個(gè)數(shù)據(jù)庫(kù)之間用逗號(hào)隔開(kāi),比如-dhuanqiu,huanpc;如果不加-d,校驗(yàn)的是所有庫(kù);
--count? ? 會(huì)計(jì)算出表的行數(shù)

如下操作:
[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu --count ? ? ? ? ?? ? ? //針對(duì)單個(gè)庫(kù)huanqiu,檢查主從數(shù)據(jù)一致性

DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanqiu checksums 0 192.168.1.101 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB 1 f163e1ff 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB 4 481dfe49 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB 5 ecb4850b 0 0 NULL NULL

[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 ?h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanpc --count ? ? ? ? ? ?? ?//針對(duì)單個(gè)庫(kù)huanpc,檢查主從數(shù)據(jù)一致性

DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanpc checksums 0 192.168.1.101 InnoDB 1 5af891e 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB 1 96d7dfcf 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB 6 a12d47d 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB 7 5681c480 0 0 NULL NULL

[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 ?h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu,huanpc --count ? ? ? ?//針對(duì)多個(gè)庫(kù)huaniu、huanpc,檢查主從數(shù)據(jù)一致性

DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanqiu checksums 0 192.168.1.101 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB 1 f163e1ff 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB 4 481dfe49 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB 5 ecb4850b 0 0 NULL NULL DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanpc checksums 0 192.168.1.101 InnoDB 1 5af891e 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB 1 96d7dfcf 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB 6 a12d47d 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB 7 5681c480 0 0 NULL NULL

上述結(jié)果中的參數(shù)解釋:
DATABASE: ? ? 檢查的庫(kù)名
TABLE: ? ? ? ? ? 檢查的庫(kù)中的表名
CHUNK: ? ? ? ? ?checksum時(shí)的近似數(shù)值
HOST: ? ? ? ? ? ?主從MYSQL的地址
ENGINE: ? ? ? ? 表引擎
COUNT: ? ? ? ? 表的行數(shù)
CHECKSUM: ?校驗(yàn)值
TIME: ? ? ? ? ? ?所用時(shí)間
WAIT: ? ? ? ? ? 等待時(shí)間
STAT: ? ? ? ? ? MASTER_POS_WAIT()返回值
LAG: ? ? ? ? ? ?slave的延時(shí)時(shí)間

mk-checksum-filter過(guò)濾工具的使用
如果只想知道huanqiu庫(kù)中哪些表不是一致的,那么只需要加一個(gè)管道符即可,如下:
[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu --count?| mk-checksum-filter ? ? ? ? ? ? ? ? ? //如下表示huanqiu庫(kù)下只有haha表的數(shù)據(jù),主從不一致

huanqiu checksums 0 192.168.1.101 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB 1 f163e1ff 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB 4 481dfe49 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB 5 ecb4850b 0 0 NULL NULL

[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 ?h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanpc --count ?| mk-checksum-filter ? ? ? ? ? ? ? ??//如下表示huanqiu庫(kù)下只有haha表的數(shù)據(jù),主從不一致

huanpc checksums 0 192.168.1.101 InnoDB 1 5af891e 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB 1 96d7dfcf 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB 6 a12d47d 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB 7 5681c480 0 0 NULL NULL

[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 ?h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu,huanpc --count?| mk-checksum-filter ? ? ? ? ? ? ? ? ? ?//如下表示huanqiu庫(kù)下只有haha表的數(shù)據(jù),主從不一致

huanqiu checksums 0 192.168.1.101 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB 1 f163e1ff 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB 4 481dfe49 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB 5 ecb4850b 0 0 NULL NULL huanpc checksums 0 192.168.1.101 InnoDB 1 5af891e 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB 1 96d7dfcf 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB 6 a12d47d 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB 7 5681c480 0 0 NULL NULL

使用mk-table-sync修復(fù)主從不同步的數(shù)據(jù)
顧名思義,mk-table-sync用來(lái)修復(fù)多個(gè)實(shí)例之間數(shù)據(jù)的不一致。它可以讓主從的數(shù)據(jù)修復(fù)到最終一致,也可以使通過(guò)應(yīng)用雙寫(xiě)或多寫(xiě)的多個(gè)不相關(guān)的數(shù)據(jù)庫(kù)實(shí)例修復(fù)到一致。同時(shí)它還內(nèi)部集成了pt-table-checksum的校驗(yàn)功能,可以一邊校驗(yàn)一邊修復(fù),也可以基于pt-table-checksum的計(jì)算結(jié)果來(lái)進(jìn)行修復(fù)。
mk-table-sync工作原理
1)單行數(shù)據(jù)checksum值的計(jì)算
計(jì)算邏輯與pt-table-checksum一樣,也是先檢查表結(jié)構(gòu),并獲取每一列的數(shù)據(jù)類型,把所有數(shù)據(jù)類型都轉(zhuǎn)化為字符串,然后用concat_ws()函數(shù)進(jìn)行連接,由此計(jì)算出該行的checksum值。checksum默認(rèn)采用crc32計(jì)算。

2)數(shù)據(jù)塊checksum值的計(jì)算
同pt-table-checksum工具一樣,pt-table-sync會(huì)智能分析表上的索引,然后把表的數(shù)據(jù)split成若干個(gè)chunk,計(jì)算的時(shí)候以chunk為單位。可以理解為把chunk內(nèi)所有行的數(shù)據(jù)拼接起來(lái),再計(jì)算crc32的值,即得到該chunk的checksum值。

3)壞塊檢測(cè)和修復(fù)
前面兩步,pt-table-sync與pt-table-checksum的算法和原理一樣。再往下,就開(kāi)始有所不同:
pt-table-checksum只是校驗(yàn),所以它把checksum結(jié)果存儲(chǔ)到統(tǒng)計(jì)表,然后把執(zhí)行過(guò)的sql語(yǔ)句記錄到binlog中,任務(wù)就算完成。語(yǔ)句級(jí)的復(fù)制把計(jì)算邏輯傳遞到從庫(kù),并在從庫(kù)執(zhí)行相同的計(jì)算。pt-table-checksum的算法本身并不在意從庫(kù)的延遲,延遲多少都一樣計(jì)算(有同事對(duì)此不理解,可以參考我的前一篇文章),不會(huì)影響計(jì)算結(jié)果的正確性(但是我們還是會(huì)檢測(cè)延遲,因?yàn)檠舆t太多會(huì)影響業(yè)務(wù),所以總是要加上—max-lag來(lái)限流)。
pt-table-sync則不同。它首先要完成chunk的checksum值的計(jì)算,一旦發(fā)現(xiàn)主從上同樣的chunk的checksum值不同,就深入到該chunk內(nèi)部,逐行比較并修復(fù)有問(wèn)題的行。其計(jì)算邏輯描述如下(以修復(fù)主從結(jié)構(gòu)的數(shù)據(jù)不一致為例,業(yè)務(wù)雙寫(xiě)的情況修復(fù)起來(lái)更復(fù)雜—因?yàn)樯婕暗經(jīng)_突解決和基準(zhǔn)選擇的問(wèn)題,限于篇幅,這里不介紹):
? ? 1)對(duì)每一個(gè)從庫(kù),每一個(gè)表,循環(huán)進(jìn)行如下校驗(yàn)和修復(fù)過(guò)程。
? ? 2)對(duì)每一個(gè)chunk,在校驗(yàn)時(shí)加上for update鎖。一旦獲得鎖,就記錄下當(dāng)前主庫(kù)的show master status值。
? ? 3)在從庫(kù)上執(zhí)行select master_pos_wait()函數(shù),等待從庫(kù)sql線程執(zhí)行到show master status得到的位置。以此保證,主從上關(guān)于這個(gè)chunk的內(nèi)容均不再改變。
? ? 4)對(duì)這個(gè)chunk執(zhí)行checksum,然后與主庫(kù)的checksum進(jìn)行比較。
? ? 5)如果checksum相同,說(shuō)明主從數(shù)據(jù)一致,就繼續(xù)下一個(gè)chunk。
? ? 6)如果checksum不同,說(shuō)明該chunk有不一致。深入chunk內(nèi)部,逐行計(jì)算checksum并比較(單行checksum比較過(guò)程與chunk的比較過(guò)程一樣,單行實(shí)際是chunk的size為1的特例)。
? ? 7)如果發(fā)現(xiàn)某行不一致,則標(biāo)記下來(lái)。繼續(xù)檢測(cè)剩余行,直到這個(gè)chunk結(jié)束。
? ? 8)對(duì)找到的主從不一致的行,采用replace into語(yǔ)句,在主庫(kù)執(zhí)行一遍以生成該行全量的binlog,并同步到從庫(kù),這會(huì)以主庫(kù)數(shù)據(jù)為基準(zhǔn)來(lái)修復(fù)從庫(kù);對(duì)于主庫(kù)有的行而從庫(kù)沒(méi)有的行,采用replace在主庫(kù)上插入(必須不能是insert);對(duì)于從庫(kù)有而主庫(kù)沒(méi)有的行,通過(guò)在主庫(kù)執(zhí)行delete來(lái)刪除(pt-table-sync強(qiáng)烈建議所有的數(shù)據(jù)修復(fù)都只在主庫(kù)進(jìn)行,而不建議直接修改從庫(kù)數(shù)據(jù);但是也有特例,后面會(huì)講到)。
? ? 9)直到修復(fù)該chunk所有不一致的行。繼續(xù)檢查和修復(fù)下一個(gè)chunk。
? ?10)直到這個(gè)從庫(kù)上所有的表修復(fù)結(jié)束。開(kāi)始修復(fù)下一個(gè)從庫(kù)。

重要選項(xiàng)
--print ? ? ? ? ? ? ? ? ? ?顯示同步需要執(zhí)行的語(yǔ)句
--execute ? ? ? ? ? ? ? 執(zhí)行數(shù)據(jù)同步
--charset=utf8 ? ? ? ?設(shè)置字符集,避免從庫(kù)亂碼。

實(shí)例說(shuō)明:
mk-table-sync的工作方式是:先一行一行檢查主從庫(kù)的表是否一樣,如果哪里不一樣,就執(zhí)行刪除,更新,插入等操作,使其達(dá)到一致。
通過(guò)上面mk-table-checksum的檢查結(jié)果可以看出,同步的兩個(gè)庫(kù)huanqiu和huanpc的數(shù)據(jù)并不一致,這時(shí)就可以使用mk-table-sync進(jìn)行數(shù)據(jù)修復(fù)了。

數(shù)據(jù)修復(fù)命令如下:(如果mysql端口是默認(rèn)的3306,則下面命令中的P=3306可以省略)
由于上面在mk-table-checksum檢查時(shí)用的data_check只有select權(quán)限,權(quán)限太小,不能用于mk-table-sync修復(fù)數(shù)據(jù)只用。
所以還需要在主庫(kù)和從庫(kù)數(shù)據(jù)庫(kù)里創(chuàng)建用于mk-table-sync修復(fù)數(shù)據(jù)之用的賬號(hào)權(quán)限

mysql> GRANT ALL ON *.* to mksync@'%' identified by "sync@123"; Query OK, 0 rows affected (0.01 sec)mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

[root@master-server lib]# mk-table-sync --execute --charset=utf8 --print --no-check-slave --databases huanqiu,huanpc h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.102,u=mksync,p=sync@123,P=3306

UPDATE `huanpc`.`checksums` SET `chunk_time`='0.002821', `chunk_index`=NULL, `lower_boundary`=NULL, `upper_boundary`=NULL, `this_crc`='5681c480', `this_cnt`='7', `master_crc`='5681c480', `master_cnt`='7', `ts`='2017-01-12 14:29:14' WHERE `db`='huanpc' AND `tbl`='heihei' AND `chunk`='1' LIMIT 1 /*maatkit src_db:huanpc src_tbl:checksums src_dsn:A=utf8,P=3306,h=192.168.1.101,p=...,u=mksync dst_db:huanpc dst_tbl:checksums dst_dsn:A=utf8,P=3306,h=192.168.1.102,p=...,u=mksync lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:13702 user:root host:master-server*/; DELETE FROM `huanpc`.`heihei` WHERE `member`='90' LIMIT 1 /*maatkit src_db:huanpc src_tbl:heihei src_dsn:A=utf8,P=3306,h=192.168.1.101,p=...,u=mksync dst_db:huanpc dst_tbl:heihei dst_dsn:A=utf8,P=3306,h=192.168.1.102,p=...,u=mksync lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:13702 user:root host:master-server*/; UPDATE `huanqiu`.`checksums` SET `chunk_time`='0.002495', `chunk_index`=NULL, `lower_boundary`=NULL, `upper_boundary`=NULL, `this_crc`='ecb4850b', `this_cnt`='5', `master_crc`='ecb4850b', `master_cnt`='5', `ts`='2017-01-12 14:27:45' WHERE `db`='huanqiu' AND `tbl`='haha' AND `chunk`='1' LIMIT 1 /*maatkit src_db:huanqiu src_tbl:checksums src_dsn:A=utf8,P=3306,h=192.168.1.101,p=...,u=mksync dst_db:huanqiu dst_tbl:checksums dst_dsn:A=utf8,P=3306,h=192.168.1.102,p=...,u=mksync lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:13702 user:root host:master-server*/; DELETE FROM `huanqiu`.`haha` WHERE `id`='90' LIMIT 1 /*maatkit src_db:huanqiu src_tbl:haha src_dsn:A=utf8,P=3306,h=192.168.1.101,p=...,u=mksync dst_db:huanqiu dst_tbl:haha dst_dsn:A=utf8,P=3306,h=192.168.1.102,p=...,u=mksync lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:13702 user:root host:master-server*/;

上面那條命令執(zhí)行后,再次檢查主從數(shù)據(jù),發(fā)現(xiàn)主從已經(jīng)同步:

[root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu,huanpc --count DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanqiu checksums 0 192.168.1.101 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu checksums 0 192.168.1.102 InnoDB 1 705c5e2e 0 0 NULL NULL huanqiu haha 0 192.168.1.101 InnoDB 3 b9b29a07 0 0 NULL NULL huanqiu haha 0 192.168.1.102 InnoDB 3 b9b29a07 0 0 NULL NULL DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG huanpc checksums 0 192.168.1.101 InnoDB 1 5af891e 0 0 NULL NULL huanpc checksums 0 192.168.1.102 InnoDB 1 5af891e 0 0 NULL NULL huanpc heihei 0 192.168.1.101 InnoDB 7 22a57b1c 0 0 NULL NULL huanpc heihei 0 192.168.1.102 InnoDB 7 22a57b1c 0 0 NULL NULL或者加mk-checksum-filter [root@master-server ~]# mk-table-checksum h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=data_check,p=check@123,P=3306 -dhuanqiu,huanpc --count | mk-checksum-filter [root@master-server ~]#

-------------------------------------------------------------------------------------------------------------------
如有報(bào)錯(cuò):
DBD::mysql::db do failed: Access denied; you need (at least one of) the SUPER privilege(s) for this operation [for Statement "/*!50105 SET @@binlog_format="STATEMENT"*/"] at /usr/local/bin/mk-table-sync line 8568.
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle ;host=192.168.1.101;port=3306;mysql_read_default_group=client at /usr/local/bin/mk-table-sync line 8568.

解決辦法:安裝DBI和DBD-MySQL
下載地址:
http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/authors/id/T/TI/TIMB/
http://search.cpan.org/dist/DBD-mysql/
或者百度云盤下載:https://pan.baidu.com/s/1miv0S8g (提取密碼:fh24

[root@master-server src]# tar -zvxf DBI-1.634.tar.gz
[root@master-server src]# cd DBI-1.634
[root@master-server DBI-1.634]# perl Makefile.PL
[root@master-server DBI-1.634]# make && make install

[root@master-server src]# tar -zvxf DBD-mysql-4.041_01.tar.gz
[root@master-server src]# cd DBD-mysql-4.041_01
[root@master-server DBD-mysql-4.041_01]# perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config ? ? ? ? //主庫(kù)mysql安裝路徑/usr/local/mysql
[root@master-server DBD-mysql-4.041_01]# make
[root@master-server DBD-mysql-4.041_01]# make install
--------------------------------------------------------------------------------------------------------------------

這里要說(shuō)明一下:
主從數(shù)據(jù)庫(kù)表和表結(jié)構(gòu)必須一致,否則會(huì)報(bào)錯(cuò)!
--no-check-slave這個(gè)參數(shù),如果不加這個(gè)參數(shù),會(huì)提示報(bào)錯(cuò),因?yàn)榇斯ぞ吣J(rèn)不允許在從庫(kù)上修改數(shù)據(jù),但這里為了不在主庫(kù)上dump出來(lái),再到從庫(kù)上導(dǎo)入進(jìn)去,加了這個(gè)參數(shù)。

特別注意的是:
1)如果想要看下到底哪些數(shù)據(jù)不同步,可以這樣做:(如果不跟-t參數(shù),就是說(shuō)同步整個(gè)庫(kù)的所有表的數(shù)據(jù))
mk-table-sync --execute --charset=utf8 --print --no-check-slave --databases huanqiu,huanpc h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.102,u=mksync,p=sync@123,P=3306 > /root/result
2)如果有好幾個(gè)從庫(kù)的話,建議分開(kāi)同步,除非幾個(gè)從庫(kù)的checksum一樣!
因?yàn)槊總€(gè)從庫(kù)同步的步調(diào)不一定都一致,如果幾個(gè)從庫(kù)一塊同步的話,很容易造成主鍵沖突,導(dǎo)致主從同步中斷。
舉個(gè)例子來(lái)說(shuō):
主庫(kù):192.168.1.101
從庫(kù)1: 192.168.1.102
從庫(kù)2: 192.168.1.103
從庫(kù)3: 192.168.1.104

建議(分開(kāi)同步,一個(gè)個(gè)操作):
mk-table-sync --execute --charset=utf8 --print --no-check-slave -d huanqiu -t haha h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.102,u=mksync,p=sync@123,P=3306 > /root/result1
mk-table-sync --execute --charset=utf8 --print --no-check-slave -d huanqiu -t haha h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.103,u=mksync,p=sync@123,P=3306 > /root/result2
mk-table-sync --execute --charset=utf8 --print --no-check-slave -d huanqiu -t haha h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.104,u=mksync,p=sync@123,P=3306 > /root/result3
不建議(放在一起同步):
mk-table-sync --execute --charset=utf8 --print --no-check-slave -d huanqiu -t haha h=192.168.1.101,u=mksync,p=sync@123,P=3306 h=192.168.1.102,u=mksync,p=sync@123,P=3306 h=192.168.1.103,u=mksync,p=sync@123,P=3306 h=192.168.1.104,u=data_check,p=check@123,P=3306 > /root/result

4)為了減少重復(fù)操作,也可以一次同步好幾個(gè)表,多個(gè)表時(shí)可以在-t后加=號(hào),即-t=tables1,tables2,table3...比如:
mk-table-sync --execute --charset=utf8 --print --no-check-slave -d huanqiu -t=haha,heihei,hehe,name h=192.168.1.101,u=data_check,p=check@123,P=3306 h=192.168.1.102,u=mksync,p=sync@123,P=3306 > /root/result

轉(zhuǎn)載于:https://www.cnblogs.com/kevingrace/p/6278200.html

總結(jié)

以上是生活随笔為你收集整理的利用mk-table-checksum监测Mysql主从数据一致性操作记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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