腾讯云数据库迁移过程中使用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系统。
首先安装依赖包:
代码语言:txt复制yuminstall perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL下载工具包:percona-toolkit
代码语言:txt复制wget http://www.percona.com/get/percona-toolkit.tar.gz运行如下命令安装工具包:
代码语言:txt复制tar zxvf percona-toolkit-2.2.13.tar.gz代码语言:txt复制cd percona-toolkit-2.2.13代码语言:txt复制perl Makefile.PL代码语言:txt复制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表:
代码语言:txt复制select * from t1;
数据已经同步过来了。
至此数据同步任务已经建立。
数据一致性校验
下面我们使用pt-table-checksum进行数据校验。
pt-table-checksum有很多参数,这里不详细描述各个参数的作用,有兴趣的同学可以参考官方文档
如果直接在10.0.0.1上运行pt-table-checksum命令时,会遇到如下问题:
代码语言:txt复制Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.这是由于找到slave导致的,这里可以通过设置--recursion-method参数解决。
代码语言:txt复制METHOD USES代码语言:txt复制=========== =============================================代码语言:txt复制processlist SHOW PROCESSLIST代码语言:txt复制hostsSHOW SLAVE HOSTS代码语言:txt复制cluster SHOW STATUS LIKE 'wsrep_incoming_addresses'代码语言:txt复制dsn=DSN DSNs from a table代码语言:txt复制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;代码语言:txt复制use percona;代码语言:txt复制CREATE TABLE `percona`.`dsns` (代码语言:txt复制`id` int(11) NOT NULL AUTO_INCREMENT,代码语言:txt复制`parent_id` int(11) DEFAULT NULL,代码语言:txt复制`dsn` varchar(255) NOT NULL,代码语言:txt复制PRIMARY KEY (`id`)代码语言:txt复制);
将slave的信息插入到表中:
代码语言:txt复制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命令:
代码语言:txt复制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这里的参数解释:
代码语言:txt复制--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。代码语言:txt复制--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。代码语言:txt复制--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 代码语言:txt复制--databases= :指定需要被检查的数据库,多个则用逗号隔开。代码语言:txt复制--tables= :指定需要被检查的表,多个用逗号隔开代码语言:txt复制h=10.0.0.2:源数据库的地址代码语言:txt复制u=zehua :用户名代码语言:txt复制p='qcloud@123456':密码代码语言:txt复制P=3306 :端口代码语言:txt复制--recursion-method : 指定slave的地址代码语言:txt复制dsn=h=10.0.0.2,u=zehua,p='qcloud@123456',P=3306,D=percona,t=dsns代码语言:txt复制dsn=h=10.0.0.2: 代表dsn表的数据库host地址;代码语言:txt复制u=zehua,p='qcloud@123456' 表示可以访问dsn表的用户名和密码;代码语言:txt复制D=percona, :代表dsn表所在的数据库是percona代码语言:txt复制t=dsns : 代表dsn表的表名是dsns
登陆到10.0.0.2的percona数据库,查询数据校验结果:
代码语言:txt复制select * from percona.checksums G;
this_crc: 7da89f71代码语言:txt复制this_cnt: 6代码语言:txt复制master_crc: 7da89f71代码语言:txt复制master_cnt: 6可以看到t1表的主从数据一致。 (本例中test库中有两个表,checksum和t1,重点关注t1表)。
至此数据一致性校验完成。


