跳到主要内容

PostgreSQL CDC 自动建表同步

自动建表同步通过原生 FROM POSTGRES (...) TO DATABASE (...) DDL 实现,目标为一个 Doris 数据库,Doris 会根据上游表结构自动创建对应的下游表。可以通过 include_tables 控制同步一张、多张或全部表,首次同步时 Doris 会自动创建下游主键表,并保持主键与上游一致。该方式适用于不需要对数据做 SQL 加工、希望下游表结构自动跟随上游的镜像复制场景。

通过集成 Flink CDC 能力,Doris 从 PostgreSQL 读取变更日志,将一组表的全量 + 增量数据通过 Stream Load 持续写入 Doris。自动建表同步支持为单张源表指定目标表名或排除非主键列;若需要 SQL 表达式、行过滤或数据转换,请参考 PostgreSQL CDC SQL 映射同步

适用场景

  • 将 PostgreSQL 整库或多张表镜像复制到 Doris
  • 下游表结构希望与上游保持一致,无需手工建表
  • 只需要简单的目标表重命名或列裁剪,无需 SQL 表达式、行过滤或数据转换
  • 既需要全量初始化,又需要持续捕获增量变更

注意事项

  1. 目前只能保证 at-least-once 语义。
  2. 仅支持同步有主键的上游表,自动创建的下游表为主键模型表(Unique Key)。
  3. 需要 Load 权限,若下游表不存在还需有 Create 权限。
  4. 自动创建表阶段,如果目标表已存在则会跳过,用户可以根据不同的场景自定义表。

快速上手

按以下步骤即可完成一次 PostgreSQL 自动建表同步作业的创建和状态检查。

步骤 1:创建导入作业

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

CREATE JOB test_postgres_job
ON STREAMING
FROM POSTGRES (
"jdbc_url" = "jdbc:postgresql://127.0.0.1:5432/postgres",
"driver_url" = "postgresql-42.5.1.jar",
"driver_class" = "org.postgresql.Driver",
"user" = "postgres",
"password" = "postgres",
"database" = "postgres",
"schema" = "public",
"include_tables" = "test_tbls",
"offset" = "latest"
)
TO DATABASE target_test_db (
"table.create.properties.replication_num" = "1" -- 单BE部署时需要设置为1
)

步骤 2:查看导入状态

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

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

参数参考

数据源参数(PostgreSQL 端)

PostgreSQL 源端参数用于配置 JDBC 连接、同步范围以及全量切片行为。连接信息、驱动信息、databaseschema 均为必填项。

参数是否必填默认值说明
jdbc_url-PostgreSQL JDBC 连接串。
driver_url-JDBC 驱动 jar 包路径,支持文件名、本地绝对路径和 HTTP 地址,详见 JDBC Catalog 概述
driver_class-JDBC 驱动类名,例如 org.postgresql.Driver
user-数据库用户名。
password-数据库密码。
database-PostgreSQL 数据库名,并应与 JDBC URL 中的数据库名一致。UTF-8 编码后不能超过 63 字节。
schema-Schema 名称。
include_tables-需要同步的表名,多个表用逗号分隔;不设置时同步 Schema 中的所有表。
exclude_tables-不同步的表名,多个表用逗号分隔。仅当未设置 include_tables 时生效。
table.<table_name>.target_table源表名自 4.1.0 版本起支持。为指定源表设置 Doris 目标表名,<table_name> 使用源表名。
table.<table_name>.exclude_columns-自 4.1.0 版本起支持。指定源表中不同步的列,多个列用逗号分隔。列必须存在,且不能排除主键列。
offsetlatest启动位点。initial:全量 + 增量同步;latest:仅同步作业启动后的增量;也可设置 JSON 精确位点,例如 {"lsn":"12345678"}。自 4.1.0 版本起支持 snapshot,表示仅全量同步。PostgreSQL 不支持 earliest
snapshot_split_size8096split 的大小(行数)。全量同步时,表会被切分成多个 split。必须为正整数。
snapshot_parallelism1全量阶段的并行度,即单次 Task 最多调度的 split 数量。必须为正整数。
skip_snapshot_backfilltrue自 4.1.0 版本起支持。是否跳过全量快照阶段的 WAL 回填。自动建表同步为 at-least-once,默认跳过,快照期间的变更会在后续增量阶段重放。
slot_namedoris_cdc_<job_id>自 4.1.0 版本起支持。逻辑复制槽名称。名称只能包含小写字母、数字和下划线,不能以数字开头,最长 63 个字符。自定义复制槽必须预先创建,且不会由 Doris 删除。
publication_namedoris_pub_<job_id>自 4.1.0 版本起支持。发布名称,命名规则与 slot_name 相同。自定义发布必须预先创建并包含所有同步表,且不会由 Doris 删除。
ssl_modedisable自 4.1.0 版本起支持。SSL 模式,可选值为 disablerequireverify-ca
ssl_rootcert条件必填-自 4.1.0 版本起支持。CA 证书文件,格式为 FILE:<file_name>ssl_modeverify-ca 时必填;文件需先通过 CREATE FILE 上传。

如果同时设置 include_tablesexclude_tables,以 include_tables 为准。以下 FROM POSTGRES 参数片段同步 orderscustomers,将 orders 写入 ods_orders 并排除非主键列 internal_note,同时使用预先创建的逻辑复制资源和 CA 校验:

"include_tables" = "orders,customers",
"table.orders.target_table" = "ods_orders",
"table.orders.exclude_columns" = "internal_note",
"slot_name" = "orders_slot",
"publication_name" = "orders_publication",
"ssl_mode" = "verify-ca",
"ssl_rootcert" = "FILE:ca.pem"

自定义复制槽和发布由用户管理,删除 Streaming Job 时 Doris 会保留它们。省略 slot_namepublication_name 时,Doris 会为作业创建对应资源,并在删除作业时清理自己创建的资源。

Doris 目标库端配置参数

目标端参数用于控制自动建表的属性以及 Stream Load 写入策略,以下参数均为可选。

参数默认值说明
table.create.properties.*-创建 Doris 表时附加的表属性,例如 table.create.properties.replication_num
load.strict_modefalse是否为 Stream Load 写入开启严格模式,取值为 truefalse
load.max_filter_ratio0采样窗口内允许的最大过滤率,取值范围为 [0, 1]0 表示不允许过滤错误行。采样窗口为 max_interval * 10 秒,窗口内错误行数与总行数之比超过该值时,作业会暂停。

参考手册

导入命令语法

创建自动建表同步作业语法如下:

CREATE JOB <job_name>
[job_properties]
ON STREAMING
[ COMMENT <comment> ]
FROM POSTGRES (
[source_properties]
)
TO DATABASE <target_db> (
[target_properties]
)

各模块说明如下:

模块说明
job_name任务名
job_properties用于指定 Job 的通用导入参数
comment用于描述 Job 作业的备注信息
source_propertiesPostgreSQL 源端相关参数
target_propertiesDoris 目标库相关参数

job_properties 支持 max_intervalcompute_group,详见持续导入概览。自动建表模式不使用 session.*

FAQ

Q1:自动建表同步与 SQL 映射同步如何选择?

  • 需要镜像复制、自动建表,或只需目标表重命名、排除非主键列时,使用自动建表同步。
  • 需要在同步链路中使用 SQL 表达式、行过滤或数据转换时,使用 PostgreSQL CDC SQL 映射同步

Q2:是否支持非主键表同步?

目前只支持主键表同步,非主键表暂不支持。

Q3:单 BE 部署时建表失败怎么办?

需要在 TO DATABASE 子句中显式设置 "table.create.properties.replication_num" = "1",避免默认副本数与可用 BE 数量不匹配。

Q4:目标表已经存在,会被覆盖吗?

不会。自动建表阶段会跳过已存在的目标表,用户可以根据需要提前自定义表结构。

Q5:如何只同步增量数据,跳过全量阶段?

offset 设置为 latest,作业将只消费最新的增量变更,不再执行全量初始化。

相关文档