MySQL主從數據一致性問題修復

MySQL主從數據一致性問題修復

前面,咱們使用pt-table-checksum 能夠檢測出主從數據是否一致的問題。發現問題後,咱們怎麼解決這些問題,也是咱們必需要會的技能。java

修復主從數據一致性問題,咱們使用pt-table-sync工具,和pt-table-checksum同樣,都須要提早安裝percona-tools工具包。怎麼安裝,我這裏就不說了,請看我以前的文章。node

下面咱們來演示一下主從數據一致性問題修復mysql

1.環境介紹

IP 端口 角色
192.168.199.230 3306 Master
192.168.199.131 3306 Slave

咱們這裏已經建立好了主從複製環境,這裏我就不演示了sql

2.建立表和數據

咱們是在Master實例上建立表和數據運維

root@localhost:mysql3306.sock [db1]> create table tb_2018 (
    -> id int not null auto_increment,
    -> cname varchar(32),
    -> ctime datetime,
    -> primary key(id)
    -> );
root@localhost:mysql3306.sock [db1]> insert into tb_2018(cname,ctime) values ('unixfbi',now());   
Query OK, 1 row affected (0.00 sec)

root@localhost:mysql3306.sock [db1]> insert into tb_2018(cname,ctime) values ('MySQL',now());  
Query OK, 1 row affected (0.00 sec)

root@localhost:mysql3306.sock [db1]> insert into tb_2018(cname,ctime) values ('JAVA',now());

3.讓主從數據不一致

咱們在從庫上添加一條數據,讓主從數據不一致。工具

oot@localhost [db1]>insert into tb_2018(cname,ctime) values ('NET',now());    
Query OK, 1 row affected (0.02 sec)
root@localhost [db1]>select * from tb_2018;
+----+---------+---------------------+
| id | cname   | ctime               |
+----+---------+---------------------+
|  1 | unixfbi | 2018-01-29 14:43:01 |
|  2 | MySQL   | 2018-01-29 14:43:10 |
|  3 | JAVA    | 2018-01-29 14:43:19 |
|  4 | NET     | 2018-01-29 14:44:15 |
+----+---------+---------------------+
4 rows in set (0.00 sec)

4.驗證主從數據是否一致

在Master實例上執行spa

# pt-table-checksum --nocheck-binlog-format --replicate=db1.checksum   -h localhost -P3306 -u root -p unixfbi --ignore-databases=mysql --recursion-method="processlist" 
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
01-29T14:45:30      0      0       44       1       0   0.496 db1.tb1
01-29T14:45:30      0      1        3       1       0   0.015 db1.tb_2018
01-29T14:45:30      0      0        1       1       0   0.264 db2.tb3
01-29T14:45:31      0      0        1       1       0   0.012 db2.tb4
01-29T14:45:31      0      0        6       1       0   0.013 sys.sys_config
01-29T14:45:31      0      0        2       1       0   0.013 wbx3306.t1
01-29T14:45:31      0      0        0       1       0   0.013 wbx3306.tp_1

發現db1.tb_2018這個表裏的數據已經不一致了。.net

5.查看不一致信息

執行pt-table-sync命令以前必定要確保checksum表的存在,也就是說必須先驗證數據是否一致,才能執行pt-table-sync命令。
這裏咱們只是查看並打印解決不一致問題的語句,因此咱們這裏使用pt-table-sync命令的--print參數。修復不一致的問題,咱們須要使用--execute參數。unix

# pt-table-sync --replicate=db1.checksum  h=192.168.199.230,u=root,p=unixfbi --print 
                                                            DELETE FROM `db1`.`tb_2018` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:db1 src_tbl:tb_2018 src_dsn:h=192.168.199.230,p=...,u=root dst_db:db1 dst_tbl:tb_2018 dst_dsn:h=dev-hd-node3,p=...,u=root lock:1 transaction:1 changing_src:db1.checksum replicate:db1.checksum bidirectional:0 pid:42455 user:ruowei host:db-node1*/;

直接打印出瞭解決主從數據不一致的語句。code

6.修復主從數據不一致問題

這裏咱們須要使用pt-table-sync命令的--execute參數

# pt-table-sync --replicate=db1.checksum  h=192.168.199.230,u=root,p=unixfbi --execute

執行修復命令後,咱們再次檢查看看數據是否一致。

# pt-table-checksum --nocheck-binlog-format --replicate=db1.checksum   -h localhost -P3306 -u root -p unixfbi --ignore-databases=mysql --recursion-method="processlist" 
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
01-29T15:13:50      0      0       44       1       0   0.016 db1.tb1
01-29T15:13:50      0      0        3       1       0   0.015 db1.tb_2018
01-29T15:13:50      0      0        1       1       0   0.013 db2.tb3
01-29T15:13:50      0      0        1       1       0   0.012 db2.tb4
01-29T15:13:50      0      0        6       1       0   0.012 sys.sys_config
01-29T15:13:50      0      0        2       1       0   0.012 wbx3306.t1
01-29T15:13:50      0      0        0       1       0   0.013 wbx3306.tp_1

發現沒有顯示數據不一致的問題。

在從庫上查看一下數據有什麼變化:

root@localhost [db1]>select * from tb_2018;
+----+---------+---------------------+
| id | cname   | ctime               |
+----+---------+---------------------+
|  1 | unixfbi | 2018-01-29 14:43:01 |
|  2 | MySQL   | 2018-01-29 14:43:10 |
|  3 | JAVA    | 2018-01-29 14:43:19 |
+----+---------+---------------------+
3 rows in set (0.00 sec)

發現是把id=4的這條數據刪除了,保證了和主庫數據一致性的。

參考文檔

http://blog.itpub.net/12679300/viewspace-1455303/

本文出自 「運維特工」 博客,轉載請務必保留原文連接 和 http://www.unixfbi.com

相關文章
相關標籤/搜索