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*/;
后记:后续想不用修改从库的配置文件和重启动数据库即可解决问题,正在寻找方法!