1. 同步整库表数据(支持新增表)
要让 Seatunnel 2.3.11 支持同步源库(source)新建的表,需要确保 CDC 能捕获到新表的 schema 变化 并 自动在 sink 端创建对应表。
核心问题分析
当前配置中 
schema-changes.enabled = true 已开启,但新建表无法同步的可能原因:Seatunnel 2.3.11 仅支持如下在线DDL:

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 验证方法
- 重启 Seatunnel 任务,确保新配置生效;
 - 在源库(172.21.204.200)的 
datawarehouse库中新建测试表:CREATE TABLE datawarehouse.test_new_table ( id INT PRIMARY KEY, name VARCHAR(50) ); - 观察 sink 库(172.21.204.201 的 
db_all)是否自动创建test_new_table; - 查看 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 
                
            
        
浙公网安备 33010602011771号