跳到主要内容

PostgreSQL CDC SQL 映射同步

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

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

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

适用场景

  • 单表实时入仓,且需要在写入前做列裁剪、过滤或表达式转换。
  • 下游 Doris 表已存在,希望由 SQL 显式控制字段映射关系。
  • 对一致性要求较高,需要 exactly-once 语义。

使用前提

在创建作业前,请先确认以下条件:

  1. 已在 PostgreSQL 端开启逻辑复制,详见配置指南
  2. 当前用户具有 Load 权限。
  3. 源表为主键表(目前仅支持主键表同步)。
  4. 已在 Doris 中预先创建好主键模型目标表(Unique Key),且表结构与映射 SQL 兼容。

注意事项

  • 支持 exactly-once 语义。
  • 目前只支持主键表同步。
  • 需要 Load 权限。
  • 需要在 PostgreSQL 端开启逻辑复制,请参考配置指南

快速上手

整体流程分为两步:创建持续导入作业、查看作业运行状态。

步骤 1:创建导入作业

使用 CREATE STREAMING JOB 创建持续导入作业,将 PostgreSQL 中 public.source_table 同步到 Doris 的 db1.tbl1

CREATE JOB pg_single_sync
ON STREAMING
DO
INSERT INTO db1.tbl1
SELECT * FROM cdc_stream(
"type" = "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",
"table" = "source_table",
"offset" = "initial"
)

步骤 2:查看导入状态

通过 jobs 表函数查看 Streaming 类型作业的运行状态:

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

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

参数说明

数据源参数

数据源参数通过 cdc_stream(...) TVF 配置,用于描述待同步的 PostgreSQL 表与读取行为。

参数是否必填默认值说明
type-数据源类型,填写 postgres
jdbc_url-PostgreSQL JDBC 连接串。
driver_url-JDBC 驱动 jar 包路径,支持文件名、本地绝对路径和 HTTP 地址,详见 JDBC Catalog 概述
driver_class-JDBC 驱动类名,例如 org.postgresql.Driver
user-数据库用户名。
password-数据库密码。
databaseJDBC URL 中的数据库名PostgreSQL 数据库名。显式设置时覆盖 JDBC URL 中的数据库名;UTF-8 编码后不能超过 63 字节。
schema-Schema 名称。
table-需要同步的表名。SQL Mapping 每个作业只支持一张源表。
offset-启动位点。initial:全量 + 增量同步;snapshot:仅全量同步;latest:仅同步作业启动后的增量;也可设置 JSON 精确位点,例如 {"lsn":"12345678"}。PostgreSQL 不支持 earliest
snapshot_split_size8096split 的大小(行数)。全量同步时,表会被切分成多个 split。必须为正整数。
snapshot_parallelism1全量阶段的并行度,即单次 Task 最多调度的 split 数量。必须为正整数。
skip_snapshot_backfillfalse是否跳过快照期间的 WAL 回填。设置为 true 时采用 at-least-once 语义。
slot_namedoris_cdc_<job_id>逻辑复制槽名称。名称只能包含小写字母、数字和下划线,不能以数字开头,最长 63 个字符。自定义复制槽必须预先创建,且不会由 Doris 删除。
publication_namedoris_pub_<job_id>发布名称,命名规则与 slot_name 相同。自定义发布必须预先创建并包含当前源表,且不会由 Doris 删除。
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 pg_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" = "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",
"schema" = "public",
"table" = "source_table",
"offset" = "initial",
"include_delete_sign" = "true"
);

自定义 slot_namepublication_name 时,需要在创建 Job 前准备好相应资源;删除 Job 时 Doris 会保留用户提供的资源。

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(...) 中设置。