定时全量实现增量数据迁移
简述
本文主要介绍使用 CloudCanal 定时全量任务和数据过滤条件,实现增量数据迁移。
- 功能优点
- 不依赖增量日志
- 可调节延迟时间
- 功能限制
- 无法同步删除数据
- 有一定延迟(取决于定时任务周期)
技术点
定时全量
CloudCanal 定时执行全量迁移或数据校验订正任务,包含 立即执行,暂停调度,恢复调度,执行历史 等功能。
在被调度的任务下方,会展现下一次将要执行的时间。
立即执行 操作将会设定任务在当前时间往后 2 分钟的时间点运行。
数据过滤
CloudCanal 数据过滤通过设定 SQL 表达式(MySQL 方言)进行。过滤操作默认在程序里面进行,部分数据源可选择将条件带到源端数据扫描 SQL 中,在数据库中执行。
程序内过滤
程序内进行数据过滤,即将源端数据流式、全量扫描出来,在程序内并行过滤。
优点:
- 支持所有种类的源端数据源,程序中采用 MySQL 方言的 SQL 引擎进行数据计算。
- 可断点续传。
- 只要支持的 SQL 表达式,均可稳定进行过滤,不需要考虑数据库执行计划如何。
- 全量迁移、增量同步均可有效支持过滤条件。
缺点:
- 全部数据将被扫出,性能较差,并且会影响源端数据库的索引命中率。
- SQL 表达式支持不完整(不支持 JOIN、子查询等)。
过滤条件下推
过滤条件下推即将 SQL 条件放入数据扫描的 where 条件中,由数据库自身过滤数据,CloudCanal 收到过滤后的数据。
优点:
- 只接收过滤后数据,数据量较小,性能较好。
- 对于某一源端数据库,可做到过滤条件全兼容,包括做 JOIN、子查询。
缺点:
- 无法做断点续传(任务中断即重做),过滤条件和分页条件组合很难调优。
- 过滤条件需要进行执行计划优化。
- 各种源端数据库过滤条件方言不一。
- 只支持全量迁移数据过滤,增量同步过滤较难。
操作步骤
下载 CloudCanal
下载安装 CloudCanal 私有部署版本。
添加数据源
登录 CloudCanal 平台,点击 数据源管理 > 新增数据源。本例使用 2 个本地 MySQL 数据库。
创建定时迁移任务
- 点击 同步任务 > 创建任务。
- 选择源和目标实例,并分别点击 测试连接。信息
如遇到测试连接长时间不返回,可以刷新页面重新选择。
数据库连接信息错误或网络不通都可能造成该现象。
在 功能配置 页面,进行以下配置:
- 任务类型选择 全量迁移。勾选定时迁移,此处单位为任务运行时间点,当前支持以下选项:
- 每小时第几分钟
- 每天某一个时间点
- 每周某一天某一时间点
- 每月某一天某一时间点
- 每年某一月某一天某一时间点
任务规格选择默认 2 GB 或 1 GB 即可。
信息不建议选择小于 1 GB 的任务,批量更新或写入较可能造成任务内存紧张,性能急剧下降。
在 表&action过滤 页面,选择需要定时数据迁移的表,可同时选择多张。
信息单个任务推荐选择不多于 1000 张表。
社区版当前支持最大 1000 张表选择,商业版不限。
在 数据处理 页面,选择具体表,点击 操作 > 数据过滤条件。可选择 高级模式 或 普通模式。如果需要设置多张表(具有功能过滤数据字段),则可点击 批量操作 > 数据过滤条件。
信息高级模式 使用标准 SQL 引擎技术,比较全面支持了以 MySQL 语法为基础的 SQL 表达式。
普通模式 为简易 SQL 表达式,功能相对较弱,也是早期产品使用的数据过滤技术,将来逐步淘汰。如本例所选择表,有
gmt_create datetime
字段,过滤表达式如下,其中设置 5 分钟为任务启动偏差(保证数据完整)。gmt_create >= DATE_SUB(NOW(), INTERVAL 65 MINUTE)
在 创建确认 页面,点击 创建任务,开始运行。
常见问题
有哪些源端数据源支持类似过滤表达式?
支持全量迁移条件下推的数据源都支持类似表达式,具体清单如下,可做参考。
源端数据源 | 过滤表达式示例 |
---|---|
MySQL | gmt_create >= DATE_SUB(NOW(), INTERVAL 65 MINUTE) |
Oracle | gmt_create >= CURRENT_TIMESTAMP - INTERVAL '65' MINUTE |
PostgreSQL | gmt_create >= NOW() - INTERVAL '65 minutes' |
SQL Server | gmt_create >= DATEADD(MINUTE, -65, GETDATE()) |
PolarDB MySQL | gmt_create >= NOW() - INTERVAL 65 MINUTE |
PolarDB-X | gmt_create >= NOW() - INTERVAL 65 MINUTE |
OceanBase(MySQL) | gmt_create >= NOW() - INTERVAL 65 MINUTE |
ObForOracle | gmt_create >= CURRENT_TIMESTAMP - INTERVAL '65' MINUTE |
Greenplum | gmt_create >= NOW() - INTERVAL '65 minutes' |
StarRocks | gmt_create >= NOW() - INTERVAL 65 MINUTE |
历史数据怎么办?
创建定时任务之后,可选择创建一个完整的全量任务补充历史数据。
如何查看设置的过滤条件?
点击 同步任务 > 任务详情 > 库表映射,点开表并点击 where 条件 按钮即可查看
如何修改设置的过滤条件?
任务处于全量迁移阶段,暂停任务,点击 任务详情 > 功能列表 > 修改订阅 进行修改。
如何修改任务的定时设置?
点击 同步任务 > 任务详情 > 功能列表 > 修改任务配置,即可修改定时任务表达式。
总结
本文主要介绍使用 CloudCanal 定时全量任务和数据过滤条件,实现增量数据迁移。