腾讯云数据库迁移过程中使用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上创建一个数据校验的账号:
代码语言:txt复制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 需要用到的表:
代码语言:txt复制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;
代码语言:txt复制this_crc: 7da89f71
代码语言:txt复制this_cnt: 6
代码语言:txt复制master_crc: 7da89f71
代码语言:txt复制master_cnt: 6
可以看到t1表的主从数据一致。 (本例中test库中有两个表,checksum和t1,重点关注t1表)。
至此数据一致性校验完成。