1. 同步整库表数据(支持新增表)

要让 Seatunnel 2.3.11 支持同步源库(source)新建的表,需要确保 CDC 能捕获到新表的 schema 变化 并 自动在 sink 端创建对应表。

核心问题分析

当前配置中 schema-changes.enabled = true 已开启,但新建表无法同步的可能原因:
Seatunnel 2.3.11 仅支持如下在线DDL:

image

1.1. 修正 Source 端的表匹配规则(关键)

原配置 table-pattern = "datawarehouse.*\\..*" 存在正则表达式错误,导致无法匹配新表。
正确配置应匹配 数据库名.表名 格式:
source {
  MySQL-CDC {
    # ... 其他配置不变 ...
    
    # 匹配 datawarehouse 库下的所有表(包括新增表)
    # 格式:数据库名\\.表名(注意转义符 \\. 表示匹配点号)
    table-pattern = "datawarehouse\\..*"  # 修正此处
    
    # 确保 schema 变化捕获开启(已配置,保留)
    schema-changes.enabled = true
  }
}

1.2. 增强 Sink 端的动态建表配置

需明确指定 sink 端的数据库名,并添加表名映射规则,确保新表能被正确创建:
 
sink {
  jdbc {
    # ... 其他配置不变 ...
    
    # 明确目标数据库名(新表会被创建到该库)
    database = "db_all"  # 原配置是 "datawarehouse",需改为 sink 实际库名
    
    # 自动生成建表 SQL(已开启,保留)
    generate_sink_sql = true
    
    # 新增:表名映射规则(可选,确保源表和目标表名一致)
    table.identifier = "${databaseName}.${tableName}"  # 保持源表名不变
    
    # 新增:建表时的表结构配置(如字符集)
    create_table_options = "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
    
    # 保留原有事务配置
    is_exactly_once = true
    xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource"
  }
}

1.3. 补充 Source 端的 DDL 事件捕获权限

确保源库(172.21.204.200)的 root 用户有 捕获 DDL 事件 的权限:
 
-- 在源 MySQL 执行(授予 replication 权限)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

1.4. 完整配置文件(修正后)

env {
  parallelism = 2
  job.mode = "STREAMING"
  checkpoint.interval = 5000
  read_limit.bytes_per_second = 7000000
  read_limit.rows_per_second = 400
}

source {
  MySQL-CDC {
    server-id = 5654-5655
    username = "root"
    password = "HkZiWdDba159+-*%"
    base-url = "jdbc:mysql://172.21.204.200:3306/datawarehouse"
    scan.startup.mode = "initial"
    schema-changes.enabled = true  # 关键:允许捕获 schema 变化(包括新表)
    database-pattern = "datawarehouse"  # 仅同步 datawarehouse 库
    table-pattern = "datawarehouse\\..*"  # 修正:匹配 datawarehouse 库下所有表(包括新增)
  }
}

sink {
  jdbc {
    url = "jdbc:mysql://172.21.204.201:3306/db_all"
    driver = "com.mysql.cj.jdbc.Driver"
    user = "root"
    password = "HkZiWdDba159+-*%"
    generate_sink_sql = true  # 关键:自动为新表生成建表语句
    database = "db_all"  # 目标库名(新表会创建到这里)
    table.identifier = "${databaseName}.${tableName}"  # 保持表名与源库一致
    create_table_options = "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"  # 建表选项
    is_exactly_once = true
    xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource"
  }
}

1.5 验证方法

  1. 重启 Seatunnel 任务,确保新配置生效;
  2. 在源库(172.21.204.200)的 datawarehouse 库中新建测试表:
    CREATE TABLE datawarehouse.test_new_table (
      id INT PRIMARY KEY,
      name VARCHAR(50)
    );
    
     
  3. 观察 sink 库(172.21.204.201 的 db_all)是否自动创建 test_new_table
  4. 查看 Seatunnel 日志(logs/seatunnel-engine-server.log),确认是否有 "create table" 相关日志,无报错即成功。

1.6 关键原理

  • schema-changes.enabled = true:让 CDC 捕获源库的 DDL 事件(包括 CREATE TABLE);
  • 正确的 table-pattern:确保新表符合匹配规则,被纳入同步范围;
  • generate_sink_sql = true:sink 端根据捕获的 DDL 自动生成建表语句。

 

通过以上配置,新增表会被自动同步到 sink 端。
 posted on 2025-09-02 20:17  xibuhaohao  阅读(27)  评论(0)    收藏  举报