Preface       We've used pt-table-checksum to checksum the different table data bwtween replication master and slaves yesterday.In this case,i'll use another of of Percona-Toolkit called "pt-table-sync" to sync these difference.These two instruments usually work together well in replication environment.Of course,pt-table-sync can be used independently,too.   Introduce       pt-table-sync is a rather useful tool because replication is commonly implemented everywhere now.On account of replication delay or artificial error,slaves may turn out to be inconsistent with master.It will help use efficiently solving the problems.The machenism is to generate SQL statements and execute them on the specified servers.Let's see some details of it.
  Procedure   Usage:
pt-table-sync [OPTIONS] DSN [DSN] --DSN format is key=value[,key=value...]

 

Parameters introduce:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
###Connect parameters.###
-h hostname
-P port
-u username
-p password
-S socket

###Object Parameters.###
-d databases
-t tables

###Frequently-used parameters.###
--execute -- Really make changes happen accoridng to the SQL statments.
--replicate -- sync differences just depend on checksums table generated by pt-table-checksum tool.
--sync-to-master -- only used to specify one slave to sync differences with master.
--replace -- Turn all the inser & update statments into repalce.

###Output parameters.###
--verbose -- Show details of SQL statements.
--print -- Print all the relevent differences.

###Other parameters.###
--dry-run -- Don't really change data at all.

 

Generate the newest "checksums" table by pt-table-checksum on master.

 1 [root@zlm2 07:55:34 ~]
 2 #pt-table-checksum --no-check-binlog-format --replicate=zlm.checksums -h192.168.1.101 -P3306 -urepl --ask-pass
 3 Enter MySQL password: 
 4 Checking if all tables can be checksummed ...
 5 Starting checksum ...
 6             TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
 7 06-22T09:29:17      0      0        0          0       1       0   0.012 mysql.columns_priv
 8 06-22T09:29:17      0      0        2          0       1       0   0.015 mysql.db
 9 06-22T09:29:17      0      0        2          0       1       0   0.016 mysql.engine_cost
10 06-22T09:29:17      0      0        0          0       1       0   0.016 mysql.event
11 06-22T09:29:17      0      0        0          0       1       0   0.017 mysql.func
12 06-22T09:29:17      0      0       40          0       1       0   0.015 mysql.help_category
13 06-22T09:29:17      0      0      693          0       1       0   0.015 mysql.help_keyword
14 06-22T09:29:17      0      0     1406          0       1       0   0.017 mysql.help_relation
15 06-22T09:29:17      0      0      637          0       1       0   0.022 mysql.help_topic
16 06-22T09:29:17      0      0        0          0       1       0   0.015 mysql.ndb_binlog_index
17 06-22T09:29:17      0      0        1          0       1       0   0.016 mysql.plugin
18 06-22T09:29:17      0      1       48          1       1       0   0.018 mysql.proc
19 06-22T09:29:17      0      0        0          0       1       0   0.014 mysql.procs_priv
20 06-22T09:29:17      0      0        1          0       1       0   0.014 mysql.proxies_priv
21 06-22T09:29:17      0      0        6          0       1       0   0.015 mysql.server_cost
22 06-22T09:29:17      0      0        0          0       1       0   0.015 mysql.servers
23 06-22T09:29:17      0      1        2          0       1       0   0.016 mysql.tables_priv
24 06-22T09:29:17      0      0        0          0       1       0   0.016 mysql.time_zone
25 06-22T09:29:17      0      0        0          0       1       0   0.018 mysql.time_zone_leap_second
26 06-22T09:29:17      0      0        0          0       1       0   0.016 mysql.time_zone_name
27 06-22T09:29:17      0      0        0          0       1       0   0.015 mysql.time_zone_transition
28 06-22T09:29:17      0      0        0          0       1       0   0.016 mysql.time_zone_transition_type
29 06-22T09:29:17      0      1        5          5       1       0   0.017 mysql.user
30 06-22T09:29:17      0      0        6          0       1       0   0.016 sys.sys_config
31 06-22T09:29:17      0      0        1          0       1       0   0.015 zlm.test_ddl
32 06-22T09:29:17      0      0        2          0       1       0   0.015 zlm.test_ddl_no_pk
33 06-22T09:29:17      0      0        0          0       1       0   0.016 zlm.test_innodb
34 06-22T09:29:17      0      0        0          0       1       0   0.018 zlm.test_myisam

 

Check the details of differet tables on slave(master won't have these records).

1 (root@localhost mysql3306.sock)[zlm]09:30:03>select db,tbl,chunk,chunk_time,this_crc,this_cnt,master_crc,master_cnt,ts from checksums where this_cnt<>master_cnt;
2 +---------+-----------+-------+------------+----------+----------+------------+------------+---------------------+
3 | db | tbl | chunk | chunk_time | this_crc | this_cnt | master_crc | master_cnt | ts |
4 +---------+-----------+-------+------------+----------+----------+------------+------------+---------------------+
5 | mysql | proc | 1 | 0.001536 | 9e5a007c | 49 | 4e0f05d9 | 48 | 2018-06-22 09:29:17 |
6 | mysql | user | 1 | 0.001122 | 7de55b47 | 10 | 587dfc7 | 5 | 2018-06-22 09:29:17 |
7 | percona | checksums | 1 | 0.000952 | 22f7b633 | 25 | d162e2ce | 29 | 2018-06-22 07:31:42 |
8 +---------+-----------+-------+------------+----------+----------+------------+------------+---------------------+
9 3 rows in set (0.00 sec)

 

Sync table data by pt-table-sync(use both "replication"&"--sync-to-master").

1 [root@zlm2 10:02:44 ~]
2 #pt-table-sync --execute --replicate zlm.checksums --print --sync-to-master h=192.168.1.102,P=3306,u=repl --ask-pass
3 Enter password for 192.168.1.102:
4 -- Omitted.

 

Check the differences again.

 1 [root@zlm2 10:01:42 ~]
 2 #pt-table-checksum --no-check-binlog-format --replicate=zlm.checksums -h192.168.1.101 -P3306 -urepl --ask-pass
 3 Enter MySQL password: 
 4 Checking if all tables can be checksummed ...
 5 Starting checksum ...
 6             TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
 7 06-22T10:02:44      0      0        0          0       1       0   0.014 mysql.columns_priv
 8 06-22T10:02:44      0      0        2          0       1       0   0.016 mysql.db
 9 06-22T10:02:44      0      0        2          0       1       0   0.018 mysql.engine_cost
10 06-22T10:02:44      0      0        0          0       1       0   0.017 mysql.event
11 06-22T10:02:44      0      0        0          0       1       0   0.017 mysql.func
12 06-22T10:02:44      0      0       40          0       1       0   0.016 mysql.help_category
13 06-22T10:02:44      0      0      693          0       1       0   0.018 mysql.help_keyword
14 06-22T10:02:44      0      0     1406          0       1       0   0.017 mysql.help_relation
15 06-22T10:02:44      0      0      637          0       1       0   0.021 mysql.help_topic
16 06-22T10:02:44      0      0        0          0       1       0   0.018 mysql.ndb_binlog_index
17 06-22T10:02:44      0      0        1          0       1       0   0.016 mysql.plugin
18 06-22T10:02:44      0      0       48          0       1       0   0.018 mysql.proc
19 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.procs_priv
20 06-22T10:02:44      0      0        1          0       1       0   0.016 mysql.proxies_priv
21 06-22T10:02:44      0      0        6          0       1       0   0.014 mysql.server_cost
22 06-22T10:02:44      0      0        0          0       1       0   0.014 mysql.servers
23 06-22T10:02:44      0      0        2          0       1       0   0.016 mysql.tables_priv
24 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.time_zone
25 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.time_zone_leap_second
26 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.time_zone_name
27 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.time_zone_transition
28 06-22T10:02:44      0      0        0          0       1       0   0.016 mysql.time_zone_transition_type
29 06-22T10:02:44      0      0        5          0       1       0   0.016 mysql.user
30 06-22T10:02:44      0      0        6          0       1       0   0.015 sys.sys_config
31 06-22T10:02:44      0      0        1          0       1       0   0.015 zlm.test_ddl
32 06-22T10:02:44      0      0        2          0       1       0   0.015 zlm.test_ddl_no_pk
33 06-22T10:02:44      0      0        0          0       1       0   0.015 zlm.test_innodb
34 06-22T10:02:44      0      0        0          0       1       0   0.015 zlm.test_myisam

 

Since no diffs above,there're no more informations when reexecute pt-table-sync.

1 [root@zlm2 10:04:29 ~]
2 #pt-table-sync --execute --replicate zlm.checksums --print --verbose --sync-to-master h=192.168.1.102,P=3306,u=repl --ask-pass
3 Enter password for 192.168.1.102: 
4 # Syncing via replication P=3306,h=192.168.1.102,p=...,u=repl
5 # DELETE REPLACE INSERT UPDATE ALGORITHM START    END      EXIT DATABASE.TABLE
6 Unknown database 'percona' [for Statement "USE `percona`"] at line 2832 while doing percona.checksums on 192.168.1.102
7 #      0       0      0      0 0         10:04:48 10:04:48 1    percona.checksums

 

Make data difference again by modify one record.

 1 ###Check Master.###
 2 (root@localhost mysql3306.sock)[zlm]10:22:00>select * from mysql.tables_priv;
 3 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
 4 | Host      | Db    | User          | Table_name | Grantor              | Timestamp           | Table_priv | Column_priv |
 5 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
 6 | localhost | mysql | mysql.session | user       | boot@connecting host | 2018-06-18 10:00:00 | Select     |             |
 7 | localhost | sys   | mysql.sys     | sys_config | root@localhost       | 2018-06-13 04:11:40 | Select     |             |
 8 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
 9 2 rows in set (0.00 sec)
10 
11 ###Modify slave.###
12 (root@localhost mysql3306.sock)[zlm]10:31:11>update mysql.tables_priv set timestamp='2018-06-20 08:00:00' where db='mysql';
13 Query OK, 1 row affected (0.00 sec)
14 Rows matched: 1  Changed: 1  Warnings: 0
15 
16 (root@localhost mysql3306.sock)[zlm]10:32:04>select * from mysql.tables_priv;
17 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
18 | Host      | Db    | User          | Table_name | Grantor              | Timestamp           | Table_priv | Column_priv |
19 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
20 | localhost | mysql | mysql.session | user       | boot@connecting host | 2018-06-18 10:00:00 | Select     |             |
21 | localhost | sys   | mysql.sys     | sys_config | root@localhost       | 2018-06-20 08:00:00 | Select     |             |
22 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
23 2 rows in set (0.00 sec)
24 
25 (root@localhost mysql3306.sock)[zlm]10:32:08>select * from mysql.tables_priv;
26 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
27 | Host      | Db    | User          | Table_name | Grantor              | Timestamp           | Table_priv | Column_priv |
28 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
29 | localhost | mysql | mysql.session | user       | boot@connecting host | 2018-06-18 10:00:00 | Select     |             |
30 | localhost | sys   | mysql.sys     | sys_config | root@localhost       | 2018-06-20 08:00:00 | Select     |             |
31 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
32 2 rows in set (0.00 sec)

 

Check the differences again.

 1 [root@zlm2 10:29:55 ~]
 2 #pt-table-checksum --no-check-binlog-format --replicate=zlm.checksums -h192.168.1.101 -P3306 -urepl --ask-pass
 3 Enter MySQL password: 
 4 Checking if all tables can be checksummed ...
 5 Starting checksum ...
 6             TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
 7 06-22T10:35:08      0      0        0          0       1       0   0.012 mysql.columns_priv
 8 06-22T10:35:08      0      0        2          0       1       0   0.014 mysql.db
 9 06-22T10:35:08      0      0        2          0       1       0   0.014 mysql.engine_cost
10 06-22T10:35:08      0      0        0          0       1       0   0.017 mysql.event
11 06-22T10:35:08      0      0        0          0       1       0   0.014 mysql.func
12 06-22T10:35:08      0      0       40          0       1       0   0.016 mysql.help_category
13 06-22T10:35:08      0      0      693          0       1       0   0.016 mysql.help_keyword
14 06-22T10:35:08      0      0     1406          0       1       0   0.017 mysql.help_relation
15 06-22T10:35:08      0      0      637          0       1       0   0.019 mysql.help_topic
16 06-22T10:35:08      0      0        0          0       1       0   0.015 mysql.ndb_binlog_index
17 06-22T10:35:08      0      0        1          0       1       0   0.013 mysql.plugin
18 06-22T10:35:08      0      0       48          0       1       0   0.016 mysql.proc
19 06-22T10:35:08      0      0        0          0       1       0   0.015 mysql.procs_priv
20 06-22T10:35:08      0      0        1          0       1       0   0.015 mysql.proxies_priv
21 06-22T10:35:08      0      0        6          0       1       0   0.015 mysql.server_cost
22 06-22T10:35:08      0      0        0          0       1       0   0.015 mysql.servers
23 06-22T10:35:08      0      1        2          0       1       0   0.014 mysql.tables_priv
24 06-22T10:35:08      0      0        0          0       1       0   0.013 mysql.time_zone
25 06-22T10:35:08      0      0        0          0       1       0   0.014 mysql.time_zone_leap_second
26 06-22T10:35:08      0      0        0          0       1       0   0.018 mysql.time_zone_name
27 06-22T10:35:08      0      0        0          0       1       0   0.016 mysql.time_zone_transition
28 06-22T10:35:08      0      0        0          0       1       0   0.017 mysql.time_zone_transition_type
29 06-22T10:35:08      0      0        5          0       1       0   0.017 mysql.user
30 06-22T10:35:08      0      0        6          0       1       0   0.016 sys.sys_config
31 06-22T10:35:08      0      0        1          0       1       0   0.017 zlm.test_ddl
32 06-22T10:35:08      0      0        2          0       1       0   0.015 zlm.test_ddl_no_pk
33 06-22T10:35:08      0      0        0          0       1       0   0.014 zlm.test_innodb
34 06-22T10:35:09      0      0        0          0       1       0   0.016 zlm.test_myisam

 

Sync table data by pt-table-sync again(only use "--replication").

1 [root@zlm2 10:35:09 ~]
2 #pt-table-sync --execute --replicate zlm.checksums --print --verbose h=192.168.1.101,P=3306,u=repl --ask-pass
3 Enter password for 192.168.1.101: 
4 # Syncing via replication P=3306,h=zlm3,p=...,u=repl
5 # DELETE REPLACE INSERT UPDATE ALGORITHM START    END      EXIT DATABASE.TABLE
6 REPLACE INTO `mysql`.`tables_priv`(`host`, `db`, `user`, `table_name`, `grantor`, `timestamp`, `table_priv`, `column_priv`) VALUES ('localhost', 'sys', 'mysql.sys', 'sys_config', 'root@localhost', '2018-06-13 04:11:40', 'Select', '') /*percona-toolkit src_db:mysql src_tbl:tables_priv src_dsn:P=3306,h=192.168.1.101,p=...,u=repl dst_db:mysql dst_tbl:tables_priv dst_dsn:P=3306,h=zlm3,p=...,u=repl lock:1 transaction:0 changing_src:zlm.checksums replicate:zlm.checksums bidirectional:0 pid:4514 user:root host:zlm2*/;
7 #      0       1      0      0 Nibble    10:35:59 10:35:59 2    mysql.tables_priv
8 Unknown database 'percona' [for Statement "USE `percona`"] at line 2832 while doing percona.checksums on zlm3
9 #      0       0      0      0 0         10:35:59 10:35:59 1    percona.checksums

 

Check the differences again.

 1 [root@zlm2 10:35:59 ~]
 2 #pt-table-checksum --no-check-binlog-format --replicate=zlm.checksums -h192.168.1.101 -P3306 -urepl --ask-pass
 3 Enter MySQL password: 
 4 Checking if all tables can be checksummed ...
 5 Starting checksum ...
 6             TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
 7 06-22T10:36:30      0      0        0          0       1       0   0.012 mysql.columns_priv
 8 06-22T10:36:30      0      0        2          0       1       0   0.016 mysql.db
 9 06-22T10:36:30      0      0        2          0       1       0   0.014 mysql.engine_cost
10 06-22T10:36:30      0      0        0          0       1       0   0.014 mysql.event
11 06-22T10:36:30      0      0        0          0       1       0   0.017 mysql.func
12 06-22T10:36:30      0      0       40          0       1       0   0.017 mysql.help_category
13 06-22T10:36:30      0      0      693          0       1       0   0.018 mysql.help_keyword
14 06-22T10:36:30      0      0     1406          0       1       0   0.017 mysql.help_relation
15 06-22T10:36:30      0      0      637          0       1       0   0.020 mysql.help_topic
16 06-22T10:36:30      0      0        0          0       1       0   0.018 mysql.ndb_binlog_index
17 06-22T10:36:30      0      0        1          0       1       0   0.017 mysql.plugin
18 06-22T10:36:30      0      0       48          0       1       0   0.017 mysql.proc
19 06-22T10:36:30      0      0        0          0       1       0   0.016 mysql.procs_priv
20 06-22T10:36:30      0      0        1          0       1       0   0.016 mysql.proxies_priv
21 06-22T10:36:30      0      0        6          0       1       0   0.018 mysql.server_cost
22 06-22T10:36:30      0      0        0          0       1       0   0.015 mysql.servers
23 06-22T10:36:30      0      0        2          0       1       0   0.015 mysql.tables_priv
24 06-22T10:36:30      0      0        0          0       1       0   0.015 mysql.time_zone
25 06-22T10:36:30      0      0        0          0       1       0   0.017 mysql.time_zone_leap_second
26 06-22T10:36:30      0      0        0          0       1       0   0.017 mysql.time_zone_name
27 06-22T10:36:30      0      0        0          0       1       0   0.016 mysql.time_zone_transition
28 06-22T10:36:30      0      0        0          0       1       0   0.015 mysql.time_zone_transition_type
29 06-22T10:36:30      0      0        5          0       1       0   0.018 mysql.user
30 06-22T10:36:30      0      0        6          0       1       0   0.015 sys.sys_config
31 06-22T10:36:30      0      0        1          0       1       0   0.018 zlm.test_ddl
32 06-22T10:36:30      0      0        2          0       1       0   0.016 zlm.test_ddl_no_pk
33 06-22T10:36:30      0      0        0          0       1       0   0.016 zlm.test_innodb
34 06-22T10:36:30      0      0        0          0       1       0   0.015 zlm.test_myisam

 

Check data in table on slave.

1 (root@localhost mysql3306.sock)[zlm]10:35:27>select * from mysql.tables_priv;                                                                        
2 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
3 | Host      | Db    | User          | Table_name | Grantor              | Timestamp           | Table_priv | Column_priv |
4 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
5 | localhost | mysql | mysql.session | user       | boot@connecting host | 2018-06-18 10:00:00 | Select     |             |
6 | localhost | sys   | mysql.sys     | sys_config | root@localhost       | 2018-06-13 04:11:40 | Select     |             |
7 +-----------+-------+---------------+------------+----------------------+---------------------+------------+-------------+
8 2 rows in set (0.00 sec)

 

Summary
  • Take care of the DSN configuration while using diffrent parameter of pt-table-sync.
  • pt-table-sync can be used without pt-table-checksum either(don't specify "--replication" parameter,but need give DSN).
  • pt-table-sync requires statement-based replication while using "--replication" or "--sync-to-master".
  • The user of execute pt-table-sync need SUPER privilege to modify the "binlog_fomat"  variable to row.
  • pt-table-sync does not relies on primary key or unique key,but "--replace" parameter does.

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄