跳到主要内容

定时全量实现增量数据迁移

简述

本文主要介绍使用 CloudCanal 定时全量任务和数据过滤条件,实现增量数据迁移。

  • 功能优点
    • 不依赖增量日志
    • 可调节延迟时间
  • 功能限制
    • 无法同步删除数据
    • 有一定延迟(取决于定时任务周期)

技术点

定时全量

CloudCanal 定时执行全量迁移或数据校验订正任务,包含 立即执行暂停调度恢复调度执行历史 等功能。

在被调度的任务下方,会展现下一次将要执行的时间。

立即执行 操作将会设定任务在当前时间往后 2 分钟的时间点运行。

数据过滤

CloudCanal 数据过滤通过设定 SQL 表达式(MySQL 方言)进行。过滤操作默认在程序里面进行,部分数据源可选择将条件带到源端数据扫描 SQL 中,在数据库中执行。

程序内过滤

程序内进行数据过滤,即将源端数据流式、全量扫描出来,在程序内并行过滤。

  • 优点:

    • 支持所有种类的源端数据源,程序中采用 MySQL 方言的 SQL 引擎进行数据计算。
    • 可断点续传。
    • 只要支持的 SQL 表达式,均可稳定进行过滤,不需要考虑数据库执行计划如何。
    • 全量迁移、增量同步均可有效支持过滤条件。
  • 缺点:

    • 全部数据将被扫出,性能较差,并且会影响源端数据库的索引命中率。
    • SQL 表达式支持不完整(不支持 JOIN、子查询等)。

过滤条件下推

过滤条件下推即将 SQL 条件放入数据扫描的 where 条件中,由数据库自身过滤数据,CloudCanal 收到过滤后的数据。

  • 优点:

    • 只接收过滤后数据,数据量较小,性能较好。
    • 对于某一源端数据库,可做到过滤条件全兼容,包括做 JOIN、子查询。
  • 缺点:

    • 无法做断点续传(任务中断即重做),过滤条件和分页条件组合很难调优。
    • 过滤条件需要进行执行计划优化。
    • 各种源端数据库过滤条件方言不一。
    • 只支持全量迁移数据过滤,增量同步过滤较难。

操作步骤

下载 CloudCanal

下载安装 CloudCanal 私有部署版本

添加数据源

登录 CloudCanal 平台,点击 数据源管理 > 新增数据源。本例使用 2 个本地 MySQL 数据库

创建定时迁移任务

  1. 点击 同步任务 > 创建任务
  2. 选择源和目标实例,并分别点击 测试连接
    信息

    如遇到测试连接长时间不返回,可以刷新页面重新选择。
    数据库连接信息错误或网络不通都可能造成该现象。

  1. 功能配置 页面,进行以下配置:

    1. 任务类型选择 全量迁移。勾选定时迁移,此处单位为任务运行时间点,当前支持以下选项:
    • 每小时第几分钟
    • 每天某一个时间点
    • 每周某一天某一时间点
    • 每月某一天某一时间点
    • 每年某一月某一天某一时间点
    1. 任务规格选择默认 2 GB 或 1 GB 即可。

      信息

      不建议选择小于 1 GB 的任务,批量更新或写入较可能造成任务内存紧张,性能急剧下降。

  2. 表&action过滤 页面,选择需要定时数据迁移的表,可同时选择多张。

    信息

    单个任务推荐选择不多于 1000 张表。
    社区版当前支持最大 1000 张表选择,商业版不限。

  1. 数据处理 页面,选择具体表,点击 操作 > 数据过滤条件。可选择 高级模式普通模式。如果需要设置多张表(具有功能过滤数据字段),则可点击 批量操作 > 数据过滤条件

    信息

    高级模式 使用标准 SQL 引擎技术,比较全面支持了以 MySQL 语法为基础的 SQL 表达式。
    普通模式 为简易 SQL 表达式,功能相对较弱,也是早期产品使用的数据过滤技术,将来逐步淘汰。

    如本例所选择表,有 gmt_create datetime 字段,过滤表达式如下,其中设置 5 分钟为任务启动偏差(保证数据完整)。

    gmt_create >= DATE_SUB(NOW(), INTERVAL 65 MINUTE)
  2. 创建确认 页面,点击 创建任务,开始运行。

常见问题

有哪些源端数据源支持类似过滤表达式?

支持全量迁移条件下推的数据源都支持类似表达式,具体清单如下,可做参考。

源端数据源过滤表达式示例
MySQLgmt_create >= DATE_SUB(NOW(), INTERVAL 65 MINUTE)
Oraclegmt_create >= CURRENT_TIMESTAMP - INTERVAL '65' MINUTE
PostgreSQLgmt_create >= NOW() - INTERVAL '65 minutes'
SQL Servergmt_create >= DATEADD(MINUTE, -65, GETDATE())
PolarDB MySQLgmt_create >= NOW() - INTERVAL 65 MINUTE
PolarDB-Xgmt_create >= NOW() - INTERVAL 65 MINUTE
OceanBase(MySQL)gmt_create >= NOW() - INTERVAL 65 MINUTE
ObForOraclegmt_create >= CURRENT_TIMESTAMP - INTERVAL '65' MINUTE
Greenplumgmt_create >= NOW() - INTERVAL '65 minutes'
StarRocksgmt_create >= NOW() - INTERVAL 65 MINUTE

历史数据怎么办?

创建定时任务之后,可选择创建一个完整的全量任务补充历史数据。

如何查看设置的过滤条件?

点击 同步任务 > 任务详情 > 库表映射,点开表并点击 where 条件 按钮即可查看

如何修改设置的过滤条件?

任务处于全量迁移阶段,暂停任务,点击 任务详情 > 功能列表 > 修改订阅 进行修改。

如何修改任务的定时设置?

点击 同步任务 > 任务详情 > 功能列表 > 修改任务配置,即可修改定时任务表达式。

总结

本文主要介绍使用 CloudCanal 定时全量任务和数据过滤条件,实现增量数据迁移。