跳到主要内容

数据过滤任务

简介

在实际业务中,用户可能只希望同步部分数据,例如最近几天的更新、某些状态为特定值的记录等。

CloudCanal 支持两种数据过滤方式:

  • 程序内过滤(默认):所有数据从源端读取后在 CloudCanal 内部执行过滤逻辑。
  • 过滤条件下推(可选):将 WHERE 条件拼接进源端 SQL,由数据库自行完成过滤。

以下将以 MySQL 到 MySQL 为例,介绍如何创建带过滤条件的同步任务。

过滤方式说明

程序内过滤(默认)

CloudCanal 从源端全量读取数据后,在内置 SQL 引擎中执行过滤表达式。该模式兼容性强,适用于所有支持的数据源。

  • 优点
    • 支持所有类型的数据源。
    • 支持断点续传。
    • 支持增量同步与全量迁移。
  • 限制
    • 需要全表读取,源端压力较大。
    • 表达式支持有限(不支持子查询、JOIN 等)。

过滤条件下推(可选)

启用该功能后,CloudCanal 会将填写的 WHERE 条件拼接至 SQL 查询中,由源端数据库直接执行过滤,减少无效数据读取。

  • 优点
    • 性能更优,源端负载更小。
    • 支持数据库自身更复杂的 SQL 表达式。
  • 限制
    • 仅适用于全量迁移和数据校验阶段。
    • 不支持断点续传,任务中断后将重做。
    • 各数据库语法差异大,需按方言调整表达式。

操作步骤

  1. 登录 CloudCanal。点击 同步任务 > 创建任务

  2. 选择源端和目标端数据源。

  3. 点击 下一步,进入 功能配置 页面,配置任务类型。
    默认采用 程序内过滤,如需启用 过滤条件下推,需将任务类型设置为 全量迁移,取消勾选 增量同步,并启用页面底部的 过滤条件下推

    信息

    过滤条件下推仅对 全量迁移数据校验 阶段生效。设置的过滤条件将自动拼接至系统生成的 SQL 语句中,用于筛选符合条件的数据。

  4. 点击 下一步,进入 表与操作过滤 页面,勾选需同步的表。

  5. 点击 下一步,进入 数据处理 页面,设置具体的过滤条件:

    1. 在左侧选择目标表,点击 操作 > 数据过滤条件。如果需要设置多张表,则可点击 批量操作 > 数据过滤条件
    2. 选择过滤模式:
    • 程序内过滤
      • 高级模式(推荐):使用标准 SQL 引擎技术,比较全面支持了以 MySQL 语法为基础的 SQL 表达式。
      • 普通模式:为简易 SQL 表达式,功能相对较弱,也是早期产品使用的数据过滤技术,将来逐步淘汰。
    • 过滤条件下推
      直接将表达式拼接至源端 SQL 的 WHERE 句子中,由数据库执行筛选逻辑,提升性能、减少无效数据传输。
    1. 填写 WHERE 条件(不包含 WHERE 关键字)。
      示例:gmt_create >= DATE_SUB(NOW(), INTERVAL 65 MINUTE)
  6. 创建确认 页面,点击 创建任务,完成配置。

表达式示例

以下是不同数据库的时间范围过滤表达式示例:

源端数据源过滤表达式示例
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

常见问题

两种过滤方式如何选择?

若追求兼容性、支持增量同步,可使用默认的 程序内过滤
若希望提升性能、只做全量数据迁移,可启用 过滤条件下推 功能。

能否同时使用两种方式?

不能。启用 过滤条件下推 后,程序只依赖源端过滤,不再在 CloudCanal 内部执行过滤。

是否支持复杂 SQL 表达式?

程序内过滤 支持基本 MySQL 表达式,暂不支持 JOIN、子查询。
下推过滤 可支持更复杂的表达式,依赖数据库能力。