percona-toolkit pt-table-checksum和pt-table-sync的使用方法

1.参考地址:

http://www.cnblogs.com/zhoujinyi/archive/2013/05/09/3067045.html


试验步骤:

(1)数据库:mvbox,  表:test

主库:192.168.0.140  3408

备库:192.168.0.156  3408

主库数据:

+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | f    |
+----+------+

备库数据:

+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+


注:所有pt-table-checksum和pt-table-sync语句均在主库上执行

(2)先用pt-table-checksum对表数据库mvbox进行检查,如下所示:

[mysql@localhost percona-toolkit-2.2.6]$ bin/pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --recursion-method=hosts --databases=mvbox h=localhost,u=admin,p=XXXXX,P=3408 -S /data/mysqldata1/sock/mysql.sock --no-check-binlog-format 
            TS                 ERRORS  DIFFS     ROWS  CHUNKS  SKIPPED    TIME       TABLE
07-11T09:51:17             0             1                  6           1                0            0.009     mvbox.test


主库的test.checksums表中数据如下:

+---------------------+
| db    | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+-------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| mvbox | test |     1 |   0.000585 | NULL        | NULL           | NULL           | b76fca95 |        6 | b76fca95   |          6 | 2014-07-11 10:15:06 |
+-------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

从库的test.checksums表数据如下:

+-------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db    | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+-------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| mvbox | test |     1 |   0.000585 | NULL        | NULL           | NULL           | f2890e1c |        4 | b76fca95   |          6 | 2014-07-11 10:15:06 |
+-------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+


(3) 执行参数解释:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。 --replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中,当指定的表不存在,pt-table-checksum自动创建。 --databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开 h=127.0.0.1 :Master的地址 u=root :用户名 p=123456 :密码 P=3306 :端口

更多的参数请见官网,上面指出来的是常用的,对该场景够用的参数。
 
 
(4)执行结果解释,如下所示:
  TS                 ERRORS  DIFFS     ROWS  CHUNKS  SKIPPED    TIME       TABLE 07-11T09:51:17             0         1        6     1        0      0.009     mvbox.test 
TS :完成检查的时间。 ERRORS :检查时候发生错误和警告的数量。 DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 ROWS :表的行数。 CHUNKS :被划分到表中的块的数目。 SKIPPED :由于错误或警告或过大,则跳过块的数目。 TIME :执行的时间。 TABLE :被检查的表名。
 
 

(5)部分需要重点说明的参数

--recursion-method 默认参数为processlist,另外的参数见下表:
METHOD USES ===========  ============================================= processlist SHOW PROCESSLIST 默认方式 hosts SHOW SLAVE HOSTS 此次检查使用的方式的方式 cluster SHOW STATUS LIKE 'wsrep\_incoming\_addresses' 这是针对性集群的 dsn=DSN      DSNs from a table  none Do not find slaves

--recursion-method运行时会提示找不到slave的情况:
提示信息如下:
[mysql@localhost percona-toolkit-2.2.6]$ bin/pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --recursion-method=hosts --databases=mvbox h=localhost,u=admin,p=XXXXXXXX,P=3408 -S /data/mysqldata1/sock/mysql.sock --no-check-binlog-format Cannot connect to P=3408,h=,p=...,u=admin Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.             TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE 07-11T10:03:44      0      0        6       1       0   0.005 mvbox.test 
 
出现问题的原因如下,使用show slave hosts命令时看不到Host信息
admin@localhost : mvbox 10:05:13> show slave hosts; +-----------+------+------+-----------+ | Server_id | Host | Port | Master_id | +-----------+------+------+-----------+ |      5009 |      | 3408 |        48 | +-----------+------+------+-----------+ 
解决方法,在从库的配置文件中加上report_host=192.168.0.156,重新启动数据库,即可解决如下问题

Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
解决后重新执行的结果见第(2)步.

(6)主库上有而从库上没有的数据,使用pt-table-sync时,如下所示:

参数解释:

--print:输出同步时需要执行的语句

--execute:执行同步操作

执行的操作是把主库上的数据复制到从库,执行的是insert语句

[mysql@localhost percona-toolkit-2.2.6]$ bin/pt-table-sync --replicate=test.checksums h=localhost,u=admin,p=admin_root,P=3408 -S /data/mysqldata1/sock/mysql.sock h=192.168.0.156,u=admin,p=XXXXXX --databases=mvbox --print --execute


REPLACE INTO `mvbox`.`test`(`id`, `name`) VALUES ('5', 'e') /*percona-toolkit src_db:mvbox src_tbl:test src_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=localhost,p=...,u=admin dst_db:mvbox dst_tbl:test dst_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=192.168.0.156,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7426 user:mysql host:localhost.localdomain*/;
REPLACE INTO `mvbox`.`test`(`id`, `name`) VALUES ('6', 'f') /*percona-toolkit src_db:mvbox src_tbl:test src_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=localhost,p=...,u=admin dst_db:mvbox dst_tbl:test dst_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=192.168.0.156,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7426 user:mysql host:localhost.localdomain*/;


(7)从库上有数据,而主库上没有的数据,使用pt-table-sync时,如下所示:

执行的操作是把从库上的数据进行删除,执行的是delete语句

[mysql@localhost percona-toolkit-2.2.6]$ bin/pt-table-sync --replicate=test.checksums h=localhost,u=admin,p=XXXX,P=3408 -S /data/mysqldata1/sock/mysql.sock h=192.168.0.156,u=admin,p=XXXX --databases=mvbox --print --execute                              

DELETE FROM `mvbox`.`test` WHERE `id`='7' LIMIT 1 /*percona-toolkit src_db:mvbox src_tbl:test src_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=localhost,p=...,u=admin dst_db:mvbox dst_tbl:test dst_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=192.168.0.156,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7429 user:mysql host:localhost.localdomain*/;
DELETE FROM `mvbox`.`test` WHERE `id`='8' LIMIT 1 /*percona-toolkit src_db:mvbox src_tbl:test src_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=localhost,p=...,u=admin dst_db:mvbox dst_tbl:test dst_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=192.168.0.156,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7429 user:mysql host:localhost.localdomain*/;
DELETE FROM `mvbox`.`test` WHERE `id`='9' LIMIT 1 /*percona-toolkit src_db:mvbox src_tbl:test src_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=localhost,p=...,u=admin dst_db:mvbox dst_tbl:test dst_dsn:P=3408,S=/data/mysqldata1/sock/mysql.sock,h=192.168.0.156,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7429 user:mysql host:localhost.localdomain*/;


后记:后续想不用修改从库的配置文件和重启动数据库即可解决问题,正在寻找方法!


你可能感兴趣的:(percona-toolkit pt-table-checksum和pt-table-sync的使用方法)