跳到主要内容

MySQL CDC SQL 映射同步

SQL 映射同步通过 Job + CDC Stream TVF 实现,目标是一张已存在的 Doris 表(INSERT INTO tbl SELECT * FROM cdc_stream(...))。借助 Doris SQL 的表达能力,可以在同步链路中进行列映射、过滤和数据转换,适用于对数据需要做加工的实时同步场景。

SQL 映射同步自 4.1.0 版本起支持。

通过集成 Flink CDC 的读取能力,Doris 从 MySQL 读取变更日志(Binlog),完成源表到目标表的全量 + 增量同步。若希望 Doris 自动创建下游表、按库为单位同步一组表,请参考 MySQL CDC 自动建表同步

适用场景

  • MySQL 单表持续同步到 Doris,目标表已规划好结构
  • 同步过程中需要进行列裁剪、列映射、字段重命名或数据转换
  • 需要保证端到端 exactly-once 语义的实时数据集成

前置条件

检查项说明
Doris 版本4.1.0 及以上
表类型上游源表必须有主键;Doris 目标表仅支持主键模型表(Unique Key)
用户权限需要 Load 权限
MySQL 配置需要在 MySQL 端开启 Binlog,参考配置指南
语义保证支持 exactly-once 语义

快速上手

下面以一个最小可运行示例展示完整流程:创建作业 → 查看状态。

步骤 1:创建导入作业

使用 CREATE STREAMING JOB 创建持续导入作业:

CREATE JOB mysql_single_sync
ON STREAMING
DO
INSERT INTO db1.tbl1
SELECT * FROM cdc_stream(
"type" = "mysql",
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306",
"driver_url" = "mysql-connector-java-8.0.25.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root",
"password" = "123456",
"database" = "source_db",
"table" = "source_table",
"offset" = "initial"
)

步骤 2:查看导入状态

select * from jobs("type"="insert") where ExecuteType = "STREAMING";

步骤 3:作业运维

更多通用操作(暂停、恢复、删除、查看 Task 等)请参考持续导入概览

参数说明

数据源参数

CDC Stream TVF 支持以下 MySQL 数据源参数。

参数是否必填默认值说明
type-数据源类型,填写 mysql
jdbc_url-MySQL JDBC 连接串。
driver_url-JDBC 驱动 jar 包路径,支持文件名、本地绝对路径和 HTTP 地址,详见 JDBC Catalog 概述
driver_class-JDBC 驱动类名,例如 com.mysql.cj.jdbc.Driver
user-数据库用户名。
password-数据库密码。
database-MySQL 数据库名。
table-需要同步的表名。SQL Mapping 每个作业只支持一张源表。
offset-启动位点。initial:全量 + 增量同步;snapshot:仅全量同步;earliest:从当前可用的最早 Binlog 位点开始;latest:仅同步作业启动后的增量;也可设置 JSON 精确位点,例如 {"file":"binlog.000001","pos":"154"}{"gtids":"<gtid_set>"}
snapshot_split_size8096split 的大小(行数)。全量同步时,表会被切分成多个 split。必须为正整数。
snapshot_parallelism1全量阶段的并行度,即单次 Task 最多调度的 split 数量。必须为正整数。
skip_snapshot_backfillfalse是否跳过快照期间的 Binlog 回填。设置为 true 时采用 at-least-once 语义。
server_id自动生成MySQL CDC reader 的 server ID。支持单值(如 5400)或闭区间(如 5400-5408);区间宽度必须大于等于 snapshot_parallelism
ssl_modedisableSSL 模式,可选值为 disablerequireverify-ca
ssl_rootcert条件必填-CA 证书文件,格式为 FILE:<file_name>ssl_modeverify-ca 时必填;文件需先通过 CREATE FILE 上传。
include_delete_signfalse是否让 TVF 额外输出 __DORIS_DELETE_SIGN__ 列。需要把源端 DELETE 同步为 Doris 主键表删除操作时设置为 true

启用 include_delete_sign 时,目标表必须为 Merge-on-Write 主键表,并在 INSERT 目标列和 SELECT 列表中显式映射 __DORIS_DELETE_SIGN__

CREATE JOB mysql_cdc_with_delete
ON STREAMING
DO
INSERT INTO db1.target_table (id, value, __DORIS_DELETE_SIGN__)
SELECT id, value, __DORIS_DELETE_SIGN__
FROM cdc_stream(
"type" = "mysql",
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306",
"driver_url" = "mysql-connector-java-8.0.25.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root",
"password" = "123456",
"database" = "source_db",
"table" = "source_table",
"offset" = "initial",
"include_delete_sign" = "true"
);

Job 配置参数

以下参数通过 CREATE JOB ... PROPERTIES (...) 设置:

参数默认值说明
max_interval10上游没有新增数据时的空闲调度间隔,单位为秒;必须为不小于 1 的整数。
compute_group当前会话或用户默认计算组仅存算分离模式支持。指定作业运行的计算组,用户必须具有该计算组的 USAGE 权限。
session.<variable_name>对应会话变量的默认值为 INSERT 任务设置会话变量,导入变量可参考 Insert Into Select

通过 ALTER JOB 重置 CDC 位点时使用的 Job Property offset 及完整限制见持续导入概览。创建作业的初始位点必须在 cdc_stream(...) 中设置。

FAQ

Q1:SQL 映射同步与自动建表同步的区别?

  • SQL 映射同步:目标 Doris 表需预先创建,支持列映射和数据转换,适合精细化加工场景。
  • 自动建表同步:Doris 自动创建下游表,按库为单位整体同步,详见 MySQL CDC 自动建表同步

Q2:是否支持非主键表作为目标表?

上游源表必须有主键,Doris 目标表目前仅支持主键模型表(Unique Key)。

Q3:如何只同步增量数据,不要历史全量?

offset 参数设置为 latest,作业将跳过全量阶段,仅同步 Binlog 增量数据。

Q4:全量同步太慢如何优化?

可调整以下两个参数提升全量阶段吞吐:

  • snapshot_split_size:增大单个 split 的行数。
  • snapshot_parallelism:提高单次 Task 调度的 split 并行度。

调整 snapshot_parallelism 时,如果同时设置了 server_id 范围,需要确保范围内的 ID 数量不少于并行度。

相关文档