使用前准备:
功能:
高效同步mysql表数据。
原理说明:
总是在主上执行数据的更改,再同步到从上,不会直接更改成 从的数据,在主上执行更改是基于主上现在的数据,不会更改主上的数据。注意使用之前先备份你的数据,避免造成数据的丢失. 执行 execute 之前最好先换成--print 或--dry-run 查看一下会变更哪些数据。
参数说明:
参数
| 说明 |
--replicate
|
指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
|
--databases
|
指定执行同步的数据库,多个用逗号隔开。
|
--tables
|
指定执行同步的表,多个用逗号隔开。
|
--sync-to-master
|
指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
|
h=127.0.0.1
|
服务器地址,命令里有2个ip,第一次出现的是M的地址,第2次是Slave的地址。
|
u=root
|
帐号。
|
p=123456
|
密码。
|
--print
|
打印,但不执行命令。
|
--execute
|
执行命令。
|
示例一: 若从库的数据比主库的多,pt-table-sync会将从库的数据删除,从而保证主从库数据一致。
从库t1表:
mysql> select * from t1;
+---+------+
| a | b |
+---+------+
| 2 | 1 |
| 5 | 5 |
+---+------+
主库t1表:
mysql> select * from t1;
+---+------+
| a | b |
+---+------+
| 3 | 1 |
| 5 | 5 |
+---+------+
执行语句:pt-table-sync --replicate=test.checksums --databases=test h=192.168.153.132,u=admin,p=123456 h=192.168.153.131,u=admin,p=123456 --print
注:前一个“h”为主库IP,后一个为从库IP,也可以不指定从库IP
打印过程语句:
DELETE FROM `test`.`t1` WHERE `a`='2' LIMIT 1
/*percona-toolkit src_db:test src_tbl:t1 src_dsn:h=192.168.153.132,p=...,u=admin dst_db:test dst_tbl:t1 dst_dsn:h=192.168.153.131,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:14452 user:root host:db2*/;
REPLACE INTO `test`.`t1`(`a`, `b`) VALUES ('3', '1') /*percona-toolkit src_db:test src_tbl:t1 src_dsn:h=192.168.153.132,p=...,u=admin dst_db:test dst_tbl:t1 dst_dsn:h=192.168.153.131,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:14452 user:root host:db2*/;
说明:从打印出来的语句,可以知道,做了两件事情,一个是更新不存在的记录,另一人是删除主库中没有而从库中有的记录,从而确保主从库数据一致性。所有操作在主库上生成,并写到binlog日志中,再同步到从库中执行。
示例二:同步指定的表
pt-table-sync --replicate=test.checksums --databases=test h=192.168.153.132,u=admin,p=123456 --print --tables=test.t6
主库t6表数据:
mysql> select * from t6;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
+---+------+
从库t6表数据:
mysql> select * from t6;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
+---+------+
打印执行过程语句:
DELETE FROM `test`.`t6` WHERE `b`='2' LIMIT 1 /*percona-toolkit src_db:test src_tbl:t6 src_dsn:h=192.168.153.132,p=...,u=admin dst_db:test dst_tbl:t6 dst_dsn:h=192.168.153.131,p=...,u=admin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:26964 user:root host:db2*/;
需要将从库中b=2的数据删除。
执行数据同步一致命令:
pt-table-sync --replicate=test.checksums --databases=test h=192.168.153.132,u=admin,p=123456 --execute --tables=test.t6 //将"--print"修改成"--execute"
执行后结果:
主库t6表数据:
mysql> select * from t6;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
+---+------+
从库t6表数据:
mysql> select * from t6;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
+---+------+
示例三:指定多个数据库
pt-table-sync --replicate=test.checksums --databases=test,db_test h=192.168.153.132,u=admin,p=123456 --print
具体不在说明,可以查看如下截图。
注:使用 --replicate=test.checksums时需要注意, test.checksums仅仅记录上次执行比较后的表数据,若下次需要重新执行。pt-table-sync 通过checksums表中的数据进行判断表的数据是否一致,若数据未更新,仅仅只会重新同步之前判断的内容。
pt-table-checksum --nocheck-replication-filters --databases=test,db_test --replicate=test.checksums --host=192.168.153.132 --user=admin --password=123456 --port=3306 --no-check-binlog-format
使用pt-table-sync时需要注意:
1. checksums需要在同步库中。
2. 进行数据同步的表需要有主键或唯一索引,否则将报如下错误:
[root@db2 percona-toolkit-2.2.6]# pt-table-sync --replicate=test.checksums --databases=test,db_test h=192.168.153.132,u=admin,p=123456 --execute
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10666. while doing test.t2 on 192.168.153.131
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10666. while doing test.t9 on 192.168.153.131
|
说明:--sync-to-master没有进行详细测试,其与--replicate=test.checksums区别在于它会show processlist或show slave status 去自动的找主。
[root@db2 percona-toolkit-2.2.6]# pt-table-sync --sync-to-master --databases=test,db_test h=192.168.153.132,u=admin,p=123456 --print
The server specified as a master has no connected slaves at /usr/local/bin/pt-table-sync line 6835. //权限可能有问题,目前暂不做测试。