mysql主從一致性檢測和修復

1、 簡介
      
pt-table-checksum是著名的 percona-toolkit 工具集的工具之一。它經過在主庫執行基於statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫,並在從庫上計算相同數據塊的checksum,最後,比較主從庫上相同數據塊的checksum值,由此判斷主從數據是否一致。這種校驗是分表進行的,在每一個表內部又是分塊進行的,並且pt工具自己提供了很是多的限流選項,所以對線上服務的衝擊較小。
2、 適用範圍
pt-table-checksum是一個在線驗證主從數據一致性的工具,主要用於如下場景:
一、數據遷移先後,進行數據一致性檢查
二、當主從複製出現問題,待修復完成後,對主從數據進行一致性檢查
三、把從庫當成主庫,進行數據更新,產生了"髒數據"
四、按期進行數據校驗
3、環境說明
Master
OS:CentOS 6.4,IP:123.59.7.118,DB Version:5.1.73
Port:3306
Slave
OS:CentOS 5.9,IP:123.59.7.109,DB Version:5.1.51
Port:3307
4、校驗過程
一、安裝yum依賴包Master、Slave所有安裝
[root@localhost ~]# yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL -y
二、安裝percona-toolkit工具包Master、Slave所有安裝
[root@localhost ~]# mkdir /SoftWare
[root@localhost ~]# cd /SoftWare
[root@localhost ~]# wget http://www.percona.com/get/percona-toolkit.tar.gz
[root@localhost ~]# tar -xvzf percona-toolkit-2.2.14.tar.gz
[root@localhost ~]# cd percona-toolkit-2.2.14
[root@localhost ~]# perl Makefile.PL
[root@localhost ~]# make && make install
三、Master建庫、建表、用戶受權
[root@localhost ~]# mysql
mysql> create database pt character set utf8;
mysql> use pt;
mysql> create table if not exists checksums (
             db char(64) NOT NULL,
             tbl char(64) NOT NULL,
             chunk int NOT NULL,
             chunk_time float NULL,
             chunk_index varchar(200) NULL,
             lower_boundary text NULL,
             upper_boundary text NULL,
             this_crc char(40) NOT NULL,
             this_cnt int NOT NULL,
             master_crc char(40) NULL,
             master_cnt int NULL,
             ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
             PRIMARY KEY (db, tbl, chunk),
             INDEX ts_db_tbl (ts, db, tbl)
             ) ENGINE=InnoDB;
mysql> GRANT UPDATE,INSERT,DELETE,SELECT,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'checksums'@'%' identified by '123456';
mysql> GRANT ALL ON pt.* TO 'checksums'@'%' IDENTIFIED BY '123456';
四、Master指定Slave信息
--test庫中建立dsns表
mysql> use test
mysql> CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); 
--指定slave信息(若是有多個slave,就插入多條slave信息)
mysql> INSERT INTO dsns (parent_id,dsn) values(1,'h=123.59.7.109,u=checksums,p=123456,P=3307');
mysql> exit
注:
①若是主從端口不一樣,執行pt-table-checksum命令時多加 --recursion-method=dsn=h=123.59.7.118,D=test,t=dsns 參數便可。
②若是主從端口相同,且都是3306端口,第4步跳過。
五、Master校驗
[root@localhost ~]# pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=50 --databases nobserver_new -u'checksums' -p'123456' -h123.59.7.118  --recursion-method=dsn=h=123.59.7.118,D=test,t=dsns
參數解釋:
# --h -u -p -P -S -d 鏈接信息
# --nocheck-replication-filters 檢測中忽略mysql 配置參數binlog_ignore_db等
# --nocheck-binlog-format 不檢測日誌格式
# --replicate 指定checksum 存儲的db和表, 如:pt.checksum
# --databases 指定數據庫,如:nobserver_new
# --chunk-size, --chunk-size-limit 用於指定檢測塊的大小, 可控性更強
# --ignore-databases/tables/column 跳出指定元素的過濾
# --lock-wait-timeout innodb 鎖的超時設定, 默認爲1
# --max-load 設置最大併發鏈接數
# --replicate-check-only 只輸出數據不一致的信息
# --help 幫助文檔
校驗結果以下圖:

列名解釋:
# --TS :完成檢查的時間
# --ERRORS :檢查時候發生錯誤和警告的數量
# --DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不一樣的信息
# --ROWS :表的行數
# --CHUNKS :被劃分到表中的塊的數目
# --SKIPPED :因爲錯誤或警告或過大,則跳過塊的數目
# --TIME :執行的時間
# --TABLE :被檢查的表名
注:
①若是主從端口相同都是3306端口,--recursion-method=dsn=h=123.59.7.118,D=test,t=dsns參數省略便可。
六、Slave查看差別信息
[root@localhost ~]# ./login_mysql_3307.sh
mysql> use pt;
mysql> select db, tbl, sum(this_cnt) as total_rows, count(*) as chunks from checksums where ( master_cnt <> this_cnt OR master_crc <> this_crc OR isnull(master_crc) <> isnull(this_crc) ) group by db, tbl; mysql

七、Master打印出消除差別sql信息
[root@localhost ~]# pt-table-sync --print --sync-to-master h=123.59.7.109,P=3307,u=checksums,p='123456' --database=nobserver_new --tables=media_class_jieliang
sql

八、Slave執行消除差別的sql語句
[root@localhost ~]# mysql
mysql> use nobserver_new;
mysql> DELETE FROM `nobserver_new`.`media_class_jieliang` WHERE `seqid`='116' LIMIT 1;
mysql> REPLACE INTO `nobserver_new`.`media_class_jieliang`(`seqid`, `dateline`, `media_class`, `a_times`, `m_times`) VALUES ('107', '20150616', '視頻網站', '7', '7');
九、Master再次進行校驗檢查同步結果
檢驗方法參考第5步,當DIFFS列所有爲0時表示Master、Slave無差別。數據庫

相關文章
相關標籤/搜索