利用mk-table-checksum监测Mysql主从数据一致性操作记录
?
前面已經(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。(不過Maatkit工具現(xiàn)在已經(jīng)不維護(hù)了,推薦還是使用percona-toolkit工具吧!)
Maatkit是一個(gè)開源的工具包,為mySQL日常管理提供了幫助,它包含很多工具,這里主要說下面兩個(gè):
1)mk-table-checksum ? ? ? ? ? ? ? ? ? ? 用來檢測(cè)master和slave上的表結(jié)構(gòu)和數(shù)據(jù)是否一致的;
2)mk-table-sync ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在主從數(shù)據(jù)不一致時(shí),用來修復(fù)數(shù)據(jù)的;先主后從有效保證表一致的工具,不必重載從表而能夠保證一致。
上面兩個(gè)perl腳本在運(yùn)行時(shí)都會(huì)鎖表,表的大小取決于執(zhí)行的快慢,勿在高峰期間運(yùn)行,可選擇凌晨。
-----------------------------------------------------------------------------------------------------
下面記錄了這一操作過程:
基本信息:
master:192.168.1.101
slave:192.168.1.102
版本:mysql5.6
同步的庫(kù):huanqiu、huanpc
Maatkit安裝過程:(主庫(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
上面命令中參數(shù)解釋:
第一個(gè)h: ? 填寫主庫(kù)ip
第一個(gè)u: ? 主庫(kù)授權(quán)的用戶名
第一個(gè)p: ? 主庫(kù)授權(quán)的密碼
第二個(gè)h: ? 填寫從庫(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)隔開,比如-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ù)一致性
[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過濾工具的使用
如果只想知道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ù),主從不一致
[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用來修復(fù)多個(gè)實(shí)例之間數(shù)據(jù)的不一致。它可以讓主從的數(shù)據(jù)修復(fù)到最終一致,也可以使通過應(yīng)用雙寫或多寫的多個(gè)不相關(guān)的數(shù)據(jù)庫(kù)實(shí)例修復(fù)到一致。同時(shí)它還內(nèi)部集成了pt-table-checksum的校驗(yàn)功能,可以一邊校驗(yàn)一邊修復(fù),也可以基于pt-table-checksum的計(jì)算結(jié)果來進(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ù)拼接起來,再計(jì)算crc32的值,即得到該chunk的checksum值。
3)壞塊檢測(cè)和修復(fù)
前面兩步,pt-table-sync與pt-table-checksum的算法和原理一樣。再往下,就開始有所不同:
pt-table-checksum只是校驗(yàn),所以它把checksum結(jié)果存儲(chǔ)到統(tǒng)計(jì)表,然后把執(zhí)行過的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來限流)。
pt-table-sync則不同。它首先要完成chunk的checksum值的計(jì)算,一旦發(fā)現(xiàn)主從上同樣的chunk的checksum值不同,就深入到該chunk內(nèi)部,逐行比較并修復(fù)有問題的行。其計(jì)算邏輯描述如下(以修復(fù)主從結(jié)構(gòu)的數(shù)據(jù)不一致為例,業(yè)務(wù)雙寫的情況修復(fù)起來更復(fù)雜—因?yàn)樯婕暗經(jīng)_突解決和基準(zhǔn)選擇的問題,限于篇幅,這里不介紹):
? ? 1)對(duì)每一個(gè)從庫(kù),每一個(gè)表,循環(huán)進(jìn)行如下校驗(yàn)和修復(fù)過程。
? ? 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相同,說明主從數(shù)據(jù)一致,就繼續(xù)下一個(gè)chunk。
? ? 6)如果checksum不同,說明該chunk有不一致。深入chunk內(nèi)部,逐行計(jì)算checksum并比較(單行checksum比較過程與chunk的比較過程一樣,單行實(shí)際是chunk的size為1的特例)。
? ? 7)如果發(fā)現(xiàn)某行不一致,則標(biāo)記下來。繼續(xù)檢測(cè)剩余行,直到這個(gè)chunk結(jié)束。
? ? 8)對(duì)找到的主從不一致的行,采用replace into語(yǔ)句,在主庫(kù)執(zhí)行一遍以生成該行全量的binlog,并同步到從庫(kù),這會(huì)以主庫(kù)數(shù)據(jù)為基準(zhǔn)來修復(fù)從庫(kù);對(duì)于主庫(kù)有的行而從庫(kù)沒有的行,采用replace在主庫(kù)上插入(必須不能是insert);對(duì)于從庫(kù)有而主庫(kù)沒有的行,通過在主庫(kù)執(zhí)行delete來刪除(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é)束。開始修復(fù)下一個(gè)從庫(kù)。
重要選項(xiàng)
--print ? ? ? ? ? ? ? ? ? ?顯示同步需要執(zhí)行的語(yǔ)句
--execute ? ? ? ? ? ? ? 執(zhí)行數(shù)據(jù)同步
--charset=utf8 ? ? ? ?設(shè)置字符集,避免從庫(kù)亂碼。
實(shí)例說明:
mk-table-sync的工作方式是:先一行一行檢查主從庫(kù)的表是否一樣,如果哪里不一樣,就執(zhí)行刪除,更新,插入等操作,使其達(dá)到一致。
通過上面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)限
[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
--------------------------------------------------------------------------------------------------------------------
這里要說明一下:
主從數(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出來,再到從庫(kù)上導(dǎo)入進(jìn)去,加了這個(gè)參數(shù)。
特別注意的是:
1)如果想要看下到底哪些數(shù)據(jù)不同步,可以這樣做:(如果不跟-t參數(shù),就是說同步整個(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ù)的話,建議分開同步,除非幾個(gè)從庫(kù)的checksum一樣!
因?yàn)槊總€(gè)從庫(kù)同步的步調(diào)不一定都一致,如果幾個(gè)從庫(kù)一塊同步的話,很容易造成主鍵沖突,導(dǎo)致主從同步中斷。
舉個(gè)例子來說:
主庫(kù):192.168.1.101
從庫(kù)1: 192.168.1.102
從庫(kù)2: 192.168.1.103
從庫(kù)3: 192.168.1.104
建議(分開同步,一個(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP封装返回Ajax字符串和JSON数
- 下一篇: maven工程导入eclipse后报错