Percona-Tookit工具包之pt-table-sync


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:

###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 ofexecute 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.

优质内容筛选与推荐>>
1、常用英文简写
2、Django 之 ModelForm
3、IntelliJ IDEA隐藏不想看到的文件或文件夹
4、Nexus 私有仓库搭建与 Maven 集成
5、jquery动态添加表单数据


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn