腾讯云MySQL数据库迁移过程中使用pt-table-checksum做数据一致性校验
腾讯云数据库迁移过程中使用pt-table-checksum做数据一致性校验
本文描述了从自建MySQL迁移到腾讯云CDB时,如何做数据一致性校验。
腾讯云提供了数据库迁移工具DTS, 使用DTS做数据库迁移时,DTS工具在迁移任务结束后,会做数据校验。
但是在迁移过程中,DTS不会进行数据一致性校验。 如果要迁移的表比较大,或者迁移过程中选择了增量迁移,并且增量同步是周期较长,那么就有需求在数据同步过程中做数据校验。
本文描述了如何使用pt-table-checksum工具在DTS数据同步过程中做数据一致性校验。
测试环境搭建
本文测试环境架构如下:
云主机CVM 10.0.0.2上运行自建的MySQL数据库, 需要迁移到腾讯云CDB上,CDB的IP地址为:10.0.1.16.
pt-table-checksum工具运行在一台云主机CVM 10.0.0.1上, 这台云主机要求和 10.0.0.2 10.0.1.16互通。
本文假设已经在云主机10.0.0.2上安装好了MySQL数据库,并且已经创建了CDB实例。
在云主机10.0.0.1上安装percona tookit, 本文云主机使用centos系统。
首先安装依赖包:
yuminstall perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
下载工具包:percona-toolkit
wget http://www.percona.com/get/percona-toolkit.tar.gz
运行如下命令安装工具包:
tar zxvf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make && make install
数据库环境准备
登陆 云主机10.0.0.2上的MySQL数据库, 创建一个测试表t1:
插入几条记录:
创建DTS迁移任务
登陆腾讯云DTS控制台,创建DTS迁移任务:
校验源数据库(10.0.0.2)的连通性
如果出现连接失败,需要先解决连接失败的问题:
本例中的连接失败是由于源数据库中root账号不允许远程登录导致的。允许root登录权限:
确认root登录的权限:
重新校验:
目标库选择已经创建好的CDB实例,IP地址为10.0.1.16:
由于是首次迁移,这里选择全量迁移,可以选择迁移整个实例,也可以选择迁移某个库里;
如果选择了数据一致性校验,那么会进行一致性校验:
查看校验失败的详情:
这里因为源数据库和CDB的GTID设置不一致导致的,源库的GTID是关闭的,开启源数据库的GTID:
重新校验通过,启动DTS任务。
等待一段时间,直至DTS迁移任务完成:
此时我们登陆到10.0.0.2中的数据库上,看一下源库中t1表中的数据:
在源库中插入一条新数据
登陆到CDB 10.0.1.16上,查询t1表:
select * from t1;
数据已经同步过来了。
至此数据同步任务已经建立。
数据一致性校验
下面我们使用pt-table-checksum进行数据校验。
pt-table-checksum有很多参数,这里不详细描述各个参数的作用,有兴趣的同学可以参考官方文档
如果直接在10.0.0.1上运行pt-table-checksum命令时,会遇到如下问题:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
这是由于找到slave导致的,这里可以通过设置--recursion-method参数解决。
METHOD USES
=========== =============================================
processlist SHOW PROCESSLIST
hostsSHOW SLAVE HOSTS
cluster SHOW STATUS LIKE 'wsrep\\_incoming\\_addresses'
dsn=DSN DSNs from a table
none Do not find slaves
这里建议使用dsn模式。 dsn模式要求将slave的信息存入一个数据库表内。 所以我们在源库10.0.0.2上创建一个数据校验的账号:
GRANT SELECT,PROCESS,SUPER,REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'zehua'@'%' identified by 'qcloud@123456';
在CDB控制台创建相同的数据库账号和密码,用于数据校验。
在源库10.0.0.2上创建pt-table-checksum 需要用到的表:
create database percona;
use percona;
CREATE TABLE `percona`.`dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
将slave的信息插入到表中:
insert into dsns(dsn) values('h=10.0.1.16,P=3306,u=zehua,p=qcloud@123456');
这里dsn的值,h=10.0.1.16 表示slave的host,u=zehua表示CDB上用于数据校验的用户。
在10.0.0.1上运行pt-table-checksum命令:
pt-table-checksum --replicate=percona.checksums --nocheck-replication-filters --no-check-binlog-format h=10.0.0.2,u=zehua,p='qcloud@12345 6',P=3306 --databases=test --recursion-method dsn=h=10.0.0.2,u=zehua,p='qcloud@123456',P=3306,D=percona,t=dsns
这里的参数解释:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
h=10.0.0.2:源数据库的地址
u=zehua :用户名
p='qcloud@123456':密码
P=3306 :端口
--recursion-method : 指定slave的地址
dsn=h=10.0.0.2,u=zehua,p='qcloud@123456',P=3306,D=percona,t=dsns
dsn=h=10.0.0.2: 代表dsn表的数据库host地址;
u=zehua,p='qcloud@123456' 表示可以访问dsn表的用户名和密码;
D=percona, :代表dsn表所在的数据库是percona
t=dsns : 代表dsn表的表名是dsns
登陆到10.0.0.2的percona数据库,查询数据校验结果:
select * from percona.checksums \\G;
this_crc: 7da89f71
this_cnt: 6
master_crc: 7da89f71
master_cnt: 6
可以看到t1表的主从数据一致。 (本例中test库中有两个表,checksum和t1,重点关注t1表)。
至此数据一致性校验完成。