第一部分-簡介
pt-table-checksum通過SQL在主庫執(zhí)行數(shù)據(jù)塊的校驗(yàn),再將相同的語句傳送到從庫,并在從庫上計(jì)算數(shù)據(jù)塊的校驗(yàn),最后將主從庫相同塊的校驗(yàn)值進(jìn)行對比,辨別主從數(shù)據(jù)是否不一致。
做網(wǎng)站、網(wǎng)站設(shè)計(jì),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向上千企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
pt-table-sync用來修復(fù)主從復(fù)制數(shù)據(jù)的不一致,使得它們修復(fù)到最終一致,也可以實(shí)現(xiàn)多個(gè)實(shí)例或者是應(yīng)用雙寫或多寫的多個(gè)不相關(guān)的數(shù)據(jù)庫實(shí)例修復(fù)到一致。同時(shí)它還內(nèi)部集成了pt-table-checksum的校驗(yàn)功能,可以一邊校驗(yàn)一邊修復(fù),也可以基于pt-table-checksum的計(jì)算結(jié)果來進(jìn)行修復(fù)。
第二部分-工具的安裝
方法1-RPM安裝
1.軟件下載:
[root@MySQL-01 ~]# wget http://www.percona.com/downloads/percona-toolkit/LATEST/RPM/percona-toolkit-2.2.7-1.noarch.rpm
2.安裝該工具依賴的軟件包:
[root@MySQL-01 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes -y
3.軟件安裝:
[root@MySQL-01 ~]# rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm
Preparing... ########################################### [100%]
1:percona-toolkit ########################################### [100%]
方法2-源碼安裝
1.軟件下載:
這兩個(gè)工具均包含在percona-toolkit里,線上下載地址: https://www.percona.com/downloads/percona-toolkit/2.2.2/。
在設(shè)備上直接下載的指令如下,下載后解壓使用:wget https://www.percona.com/downloads/percona-toolkit/2.2.2/percona-toolkit-2.2.2.tar.gz
2、安裝依賴軟件包
yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
3、軟件安裝
tar zxvf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make && make install
第三部分-使用checksum檢驗(yàn)數(shù)據(jù)一致性
1、 主庫創(chuàng)建如下對象
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS percona
創(chuàng)建表
use percona
Create Table: CREATE TABLE `checksums` (
`db` char(64) NOT NULL,
`tbl` char(64) NOT NULL,
`chunk` int(11) NOT NULL,
`chunk_time` float DEFAULT NULL,
`chunk_index` varchar(200) DEFAULT NULL,
`lower_boundary` text,
`upper_boundary` text,
`this_crc` char(40) NOT NULL,
`this_cnt` int(11) NOT NULL,
`master_crc` char(40) DEFAULT NULL,
`master_cnt` int(11) DEFAULT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`db`,`tbl`,`chunk`),
KEY `ts_db_tbl` (`ts`,`db`,`tbl`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
如果使用系統(tǒng)自動創(chuàng)建的表
mysql> alter table checksums modify ts timestamp not null default current_timestamp
如果使用已存在的數(shù)據(jù)庫,則把此表創(chuàng)建到此庫下。使用--replicate=test.checksums 進(jìn)行指定即可
2、主庫創(chuàng)建需要的用戶及授權(quán)
此用戶的是作為pt-table-checksum連接主備庫,進(jìn)行數(shù)據(jù)校驗(yàn)使用的,所已主備庫必須存在相同的且能登錄的用戶
GRANT UPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO 'procheck'@'172.31.150.37' identified by 'Mysql.37';
GRANT ALL ON percona.* TO 'procheck'@'172.31.150.37'
3、執(zhí)行命令進(jìn)行數(shù)據(jù)校驗(yàn)
執(zhí)行命令
pt-table-checksum -u'procheck' -p'Mysql.37' -h272.31.150.37 -P 3316 --databases=agati --ignore-tables=sys_log --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --recursion-method=processlist
其他參數(shù)及備選參數(shù)解釋
--u'lxh'
--p'Mysql.163'
--h 192.168.XXX.XX 主庫IP地址
--P 3306 主庫端口
--databases=db1 校驗(yàn)db1庫里
--tables=tb1 的tb1表,若無此參數(shù)則校驗(yàn)全庫全表。
--no-check-binlog-format 被檢查的主從binlog_format必須為statement,如果不是statement-based就要添加此參數(shù)
--nocheck-plan 檢查 query的執(zhí)行計(jì)劃(優(yōu)先選擇能夠?qū)Ρ磉M(jìn)行chunk 分組的索引)
--nocheck-replication-filters 不檢查復(fù)制過濾器,建議啟用。
--recursion-method="processlist" 其參數(shù)有四:processlist/hosts/dsn=DSN/no,用來決定查找slave的方式是show full processlist還是show slave hosts還是命令行直接指定還是壓根就不準(zhǔn)備找從庫;
使用DNS方法
配置
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
列名的含義
parent_id:一個(gè)需要無特別意義
dsn:配置內(nèi)容,h表示host指slave的ip,u表示user指創(chuàng)建的檢查用戶,p指此用戶密碼,P指備庫端口
INSERT INTO dsns (parent_id,dsn) values(1,'h=172.31.150.36,u=procheck,p=Mysql.37,P=3316');
INSERT INTO dsns (parent_id,dsn) values(2,'h=172.29.147.32,u=procheck,p=Mysql.37,P=3376');
使用
--recursion-method=dsn=h=172.31.150.37,D=percona,t=dsns
D指:存放配置表的數(shù)據(jù)庫名字
T指:存放配置的表名字
--set-varsinnodb_lock_wait_timeout=120鎖的超時(shí)設(shè)定, 默認(rèn)為1
--replicate=test.checksums 用來指定存放計(jì)算結(jié)果的表名,默認(rèn)是percona.checksums,工具會默認(rèn)自動創(chuàng)建庫percona和表checksums并將checksum的檢查結(jié)果輸入到這個(gè)表中,如果自己用該參數(shù)去指定表的話,表結(jié)構(gòu)必須是上面創(chuàng)建的表結(jié)構(gòu)
4、查看校驗(yàn)結(jié)果哦
結(jié)果可以在執(zhí)行命令后出現(xiàn)
也可以查詢之前創(chuàng)建的表
檢查結(jié)果各列含義
TS :完成檢查的時(shí)間。
ERRORS :檢查時(shí)候發(fā)生錯誤和警告的數(shù)量。
DIFFS :0表示一致,大于0表示不一致。主要看這一列有無不一致數(shù)據(jù)。
ROWS :表的行數(shù)。
CHUNKS :被劃分到表中的塊的數(shù)目。
SKIPPED :由于錯誤或警告或過大,則跳過塊的數(shù)目。
TIME :執(zhí)行的時(shí)間。
TABLE :被檢查的表名。
第四部份-報(bào)錯解決
問題(1)
01-07T15:19:02 Error checksumming table test.test1:
Error executing checksum query: DBD::mysql::st execute failed: Field 'ts' doesn't have a default value
[for Statement "REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc)
SELECT ?, ?, ?, ?, ?, ?, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `host`, `user`, `select_priv`, `insert_priv`,
`update_priv`, `delete_priv`, `create_priv`, `drop_priv`, `reload_priv`, `shutdown_priv`, `process_priv`, `file_priv`, `grant_priv`,
`references_priv`, `index_priv`, `alter_priv`, `show_db_priv`, `super_priv`, `create_tmp_table_priv`, `lock_tables_priv`, `execute_priv`,
`repl_slave_priv`, `repl_client_priv`, `create_view_priv`, `show_view_priv`, `create_routine_priv`, `alter_routine_priv`, `create_user_priv`,
`event_priv`, `trigger_priv`, `create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`,
`max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`,
`password_last_changed` + 0, `password_lifetime`, `account_locked`, CONCAT(ISNULL(`authentication_string`),
ISNULL(`password_last_changed`), ISNULL(`password_lifetime`)))) AS UNSIGNED)), 10, 16)), 0) AS crc
FROM `test`.`test1` /*checksum table*/" with ParamValues: 0='test', 1='test1', 2=1, 3=undef, 4=undef, 5=undef]
at /usr/local/bin/pt-table-checksum line 10305.
解決
mysql> alter table checksums modify ts timestamp not null default current_timestamp