腾讯云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表)。

至此数据一致性校验完成。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区