根据你提供的 MySQL-CDC 源配置(同步 testdb 库的 table1-table4 共 4 张表),结合 SeaTunnel 2.3.8 版本的 JDBC MySQL Sink 连接器(文档参考:MySQL Sink),Sink 需满足 “多表一对一同步”(源表 testdb.tableN 对应目标表 目标库.tableN),同时支持 CDC 事件(insert/update/delete)的正确处理。以下是具体的 Sink 配置方案,分「基础版」「CDC 完整版」「Exactly-Once 版」三类场景说明:

核心前提

  1. 目标库准备:确保目标 MySQL 中已创建与源表结构一致的目标表(如 testdb.table1testdb.table1,或跨库同步到 targetdb.table1);若需自动创建表,可通过 schema_save_mode 配置。
  2. CDC 事件适配:源是 MySQL-CDC(含 insert/update/delete 事件),Sink 需配置 primary_keys(主键),才能自动生成 INSERT/UPDATE/DELETE 语句,避免数据混乱。
  3. 动态表名:源同步多表,Sink 需用 动态表名变量 ${table_name} 匹配源表与目标表(MySQL-CDC 源会自动向上游传递 table_name 字段,值为 testdb.tableN)。

方案 1:基础多表同步(CDC 事件支持)

适用于「源表与目标表名一致、结构一致」的场景,自动生成 SQL 处理 CDC 事件,无需手动写 INSERT 语句。
env {
  parallelism = 1          # 与源并行度匹配,或根据目标库性能调整
  job.mode = "STREAMING"   # 源是 CDC 流处理,必须设为 STREAMING
  checkpoint.interval = 10000  #  checkpoint 间隔,保证容错,单位:毫秒
}

source {
  MySQL-CDC {
    base-url = "jdbc:mysql://localhost:3306/testdb"  # 源 MySQL 地址
    username = "root"                                # 源库账号
    password = "root@123"                            # 源库密码
    table-names = ["testdb.table1", "testdb.table2", "testdb.table3", "testdb.table4"]  # 源同步表
    startup.mode = "initial"  # 先同步存量快照,再同步增量变更
    # (可选)若源表主键不同,需在这里指定每个表的主键,Sink 可复用
    table-names-config = [
      {"table": "testdb.table1", "primaryKeys": ["id"]},    # table1 主键是 id
      {"table": "testdb.table2", "primaryKeys": ["user_id"]} # table2 主键是 user_id
    ]
  }
}

sink {
  jdbc {
    # 1. 目标 MySQL 连接配置
    url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"
    # 目标库地址(若跨库同步,将 testdb 改为目标库名,如 targetdb)
    driver = "com.mysql.cj.jdbc.Driver"  # MySQL 驱动(必填)
    user = "root"                        # 目标库账号
    password = "root@123"                # 目标库密码

    # 2. 动态匹配源表与目标表(核心:处理多表同步)
    generate_sink_sql = true  # 自动生成 INSERT/UPDATE/DELETE 语句(无需手动写 query)
    database = "testdb"       # 目标数据库名(与源库一致,或改为目标库)
    table = "${table_name}"   # 动态表名:引用上游 CDC 传递的源表名(如 testdb.table1)

    # 3. 处理 CDC 事件(必须配置主键,否则无法处理 update/delete)
    # 若所有表主键相同(如都是 id),直接写 ["id"];若不同,用动态变量 ${primary_keys}(需源端 table-names-config 配置)
    primary_keys = "${primary_keys}"  # 动态引用源表配置的主键

    # 4. 表结构与数据处理策略(可选)
    schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"  # 目标表不存在时自动创建(避免手动建表)
    data_save_mode = "APPEND_DATA"  # 追加/更新数据(CDC 场景默认用这个)

    # 5. 批量写入优化(可选)
    batch_size = 2000  # 批量写入大小(默认1000,可根据目标库性能调整)
    max_retries = 3    # 写入失败重试次数
  }
}
 

方案 2:支持 Exactly-Once 语义(精准一次写入)

若业务要求「数据不重复、不丢失」,需启用 XA 事务(依赖目标 MySQL 支持 XA),配置如下(仅修改 Sink 部分关键参数):
sink {
  jdbc {
    # 1. 基础连接配置(同方案1)
    url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"
    driver = "com.mysql.cj.jdbc.Driver"
    user = "root"
    password = "root@123"

    # 2. 动态表与 CDC 配置(同方案1)
    generate_sink_sql = true
    database = "testdb"
    table = "${table_name}"
    primary_keys = "${primary_keys}"
    schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"

    # 3. Exactly-Once 核心配置(新增)
    is_exactly_once = true  # 启用精准一次语义
    xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource"  # MySQL XA 数据源类(必填)
    max_commit_attempts = 3  # 事务提交失败重试次数
    transaction_timeout_sec = 60  # 事务超时时间(单位:秒,避免长事务阻塞)
  }
}
 

方案 3:手动指定 SQL(适合特殊写入逻辑)

若需自定义写入逻辑(如字段映射、过滤),可不用 generate_sink_sql,而是手动写 query,但需注意 多表场景需用动态 SQL(依赖 SeaTunnel 动态参数):
sink {
  jdbc {
    url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8"
    driver = "com.mysql.cj.jdbc.Driver"
    user = "root"
    password = "root@123"

    # 手动写动态 SQL(${table_name} 动态匹配表名,${field1} 等是源表字段)
    query = "INSERT INTO ${table_name} (id, name, create_time) VALUES (?, ?, ?) 
             ON DUPLICATE KEY UPDATE name=?, create_time=?"  # 处理更新(基于主键)

    # 批量写入优化
    batch_size = 2000
    max_retries = 3
  }
}
 

关键配置说明

  1. 动态表名 ${table_name}
    上游 MySQL-CDC 源会自动为每条数据添加 table_name 元数据(值为源表名,如 testdb.table1),Sink 用 ${table_name} 可直接匹配目标表,实现 “多表一对一同步”。
  2. 主键 primary_keys
    CDC 事件(update/delete)需通过主键判断目标行,若源表主键不同,必须在 source 的 table-names-config 中指定每个表的主键,Sink 用 ${primary_keys} 动态引用。
  3. generate_sink_sql = true
    自动生成与 CDC 事件匹配的 DML 语句(如 insert 对应 INSERT,update 对应 UPDATE,delete 对应 DELETE),无需手动编写复杂 SQL,推荐优先使用。
  4. schema_save_mode
    设为 CREATE_SCHEMA_WHEN_NOT_EXIST 时,Sink 会根据源表结构自动创建目标表(字段类型按文档中「Data Type Mapping」映射),避免手动建表的繁琐。

注意事项

  1. 目标库权限:Sink 所用的 MySQL 账号需具备「目标库的 INSERT/UPDATE/DELETE/CREATE TABLE 权限」(若开启自动建表)。
  2. 字段类型匹配:确保源表与目标表字段类型兼容(参考文档中「MySQL 与 SeaTunnel 数据类型映射」,Sink 自动建表会按映射规则处理)。
  3. 跨库同步:若目标库不是源库(如源是 testdb,目标是 targetdb),只需修改 Sink 的 url 中 3306/ 后的数据库名,且目标库需提前创建(或依赖 schema_save_mode 自动创建)。
  4. 性能调优:可调整 batch_size(批量大小)、parallelism(并行度)、checkpoint.interval( checkpoint 间隔),避免目标库写入压力过大。
 posted on 2025-09-02 17:41  xibuhaohao  阅读(27)  评论(0)    收藏  举报