作者:刘安
爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
如何配合pt-osc使用DTLE同步DDL
背景:在社区群里有同学询问,源库使用pt-osc做表DDL变更,DTLE是否支持?
1. pt-osc的原理
1). 创建一个与原表结构相同的空表,表名是_原表名_new
2). 修改步骤 1 创建的空表的表结构
3). 在原表上添加三个触发器:delete/update/insert,用于在复制数据过程中,将原表中的数据变更同步到_原表名_new
表
4). 将原表数据以数据块的形式复制到_原表名_new
表
5). rename 原表
为_原表名_old
表,并把_原表名_new
表 rename 为原表
,然后删除_原表名_old
表
6). 删除触发器
2. DTLE对DDL的支持
根据DTLE的文档https://actiontech.github.io/dtle-docs-cn/3/3.6_DDL.html中的描述可知:
1). DTLE支持create/altert/drop table
语句
2). DTLE虽然不支持同步触发器相关的DDL,但是触发器产生的数据可以同步到目标端
3). DTLE支持rename
语句
看来DTLE应该是支持pt-osc做表DDL变更的,接下就具体操作一下。
3. 操作步骤
1). 部署DTLE集群,这里使用的是dtle-ce-4.22.01.0版本
2). 在源端MySQL准备一些数据
代码语言:sql复制mysql> CREATE DATABASE action_db;
shell> sysbench /usr/share/sysbench/oltp_common.lua --mysql-host=172.100.9.1 --mysql-port=3306 --mysql-user=test --mysql-password=test --create_secondary=off --mysql-db=action_db --tables=1 --table_size=100000 prepare
3). 创建一个DTLE任务
注意此处需要将_原表名_old
表和_原表名_new
都加入都DTLE任务的同步范围
job "test_pt_osc" {
datacenters = ["dc1"]
group "Src" {
task "src" {
driver = "dtle"
config {
ReplicateDoDb = [{
TableSchema = "action_db"
Tables = [{
TableName = "sbtest1"
},
{
TableName = "_sbtest1_new"
},
{
TableName = "_sbtest1_old"
}]
}]
ConnectionConfig = {
Host = "172.100.9.1"
Port = 3306
User = "test_src"
Password = "test_src"
}
}
}
}
group "Dest" {
task "dest" {
driver = "dtle"
config {
ConnectionConfig = {
Host = "172.100.9.2"
Port = 3306
User = "test_dest"
Password = "test_dest"
}
}
}
}
}
4). 查看两端数据库的表结构
5). 源端MySQL持续添加数据
代码语言:sql复制shell> sysbench /usr/share/sysbench/oltp_write_only.lua --mysql-host=172.100.9.1 --mysql-port=3306 --mysql-user=test --mysql-password=test --report-interval=3 --mysql-db=action_db --tables=1 --table_size=100000 --time=10 --rate=100 run
6). 在源端有数据流量的同时,执行pt-osc命令
代码语言:sql复制shell> pt-online-schema-change --print --statistics --progress time,30 --user=test --password=test --alter 'modify c varchar(200) not null default ""' --chunk-size=10000 --nocheck-replication-filters --host=172.100.9.1 --port=3306 D=action_db,t=sbtest1 --execute
在执行pt-ost命令期间,会有试图连接源端DTLE的报错。这是因为DTLE伪装成MySQL从实例获取binlog,而pt-ost会检查主从之间的延迟造成的。此报错不会影响pt-osc的执行。
7). 检查DDL被正确同步以及数据的一致性
4. 总结
1). 使用pt-osc工具做表DDL变更DTLE是支持的
2). 虽然本例中指定了需要同步的表,实际上直接创建一个Database级别的任务也可以达到同-样的效果
3). 需要在创建DTLE任务的时候就规划好要同步的表,后期再另建任务同步_old
表和_new
表会造成数据不一致