percona-toolkit之pt-table-checksum
阿新 • • 發佈:2019-01-09
自動 安裝 log data expire esp ODB index 實現 第一部分-簡介
pt-table-checksum通過SQL在主庫執行數據塊的校驗,再將相同的語句傳送到從庫,並在從庫上計算數據塊的校驗,最後將主從庫相同塊的校驗值進行對比,辨別主從數據是否不一致。
pt-table-checksum通過SQL在主庫執行數據塊的校驗,再將相同的語句傳送到從庫,並在從庫上計算數據塊的校驗,最後將主從庫相同塊的校驗值進行對比,辨別主從數據是否不一致。
pt-table-sync用來修復主從復制數據的不一致,使得它們修復到最終一致,也可以實現多個實例或者是應用雙寫或多寫的多個不相關的數據庫實例修復到一致。同時它還內部集成了pt-table-checksum的校驗功能,可以一邊校驗一邊修復,也可以基於pt-table-checksum的計算結果來進行修復。
第二部分-工具的安裝
方法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.軟件下載: 這兩個工具均包含在percona-toolkit裏,線上下載地址: https://www.percona.com/downloads/percona-toolkit/2.2.2/。 在設備上直接下載的指令如下,下載後解壓使用: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檢驗數據一致性
1、 主庫創建如下對象
創建數據庫
CREATE DATABASE IF NOT EXISTS percona
創建表 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 如果使用系統自動創建的表 mysql> alter table checksums modify ts timestamp not null default current_timestamp 如果使用已存在的數據庫,則把此表創建到此庫下。使用--replicate=test.checksums 進行指定即可
2、主庫創建需要的用戶及授權
此用戶的是作為pt-table-checksum連接主備庫,進行數據校驗使用的,所已主備庫必須存在相同的且能登錄的用戶
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、執行命令進行數據校驗
執行命令 pt-table-checksum -u‘procheck‘ -p‘Mysql.37‘ -h172.31.150.37 -P 3316 --databases=agati --ignore-tables=sys_log --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --recursion-method=processlist 其他參數及備選參數解釋 --u‘lxh‘ --p‘Mysql.163‘ --h 192.168.XXX.XX 主庫IP地址 --P 3306 主庫端口 --databases=db1 校驗db1庫裏 --tables=tb1 的tb1表,若無此參數則校驗全庫全表。 --no-check-binlog-format 被檢查的主從binlog_format必須為statement,如果不是statement-based就要添加此參數 --nocheck-plan 檢查 query的執行計劃(優先選擇能夠對表進行chunk 分組的索引) --nocheck-replication-filters 不檢查復制過濾器,建議啟用。 --recursion-method="processlist" 其參數有四:processlist/hosts/dsn=DSN/no,用來決定查找slave的方式是show full processlist還是show slave hosts還是命令行直接指定還是壓根就不準備找從庫; 使用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:一個需要無特別意義 dsn:配置內容,h表示host指slave的ip,u表示user指創建的檢查用戶,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指:存放配置表的數據庫名字 T指:存放配置的表名字 --set-varsinnodb_lock_wait_timeout=120鎖的超時設定, 默認為1 --replicate=test.checksums 用來指定存放計算結果的表名,默認是percona.checksums,工具會默認自動創建庫percona和表checksums並將checksum的檢查結果輸入到這個表中,如果自己用該參數去指定表的話,表結構必須是上面創建的表結構
4、查看校驗結果哦
結果可以在執行命令後出現
也可以查詢之前創建的表
檢查結果各列含義
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,大於0表示不一致。主要看這一列有無不一致數據。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
第四部份-報錯解決
問題(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
percona-toolkit之pt-table-checksum