logical_ddl

在 PostgreSQL 逻辑复制中复制受支持的 DDL 变更

概览

扩展包名版本分类许可证语言
logical_ddl0.1.0ETLMITC
ID扩展名BinLibLoadCreateTrustReloc模式
9530logical_ddllogical_ddl

Pigsty carries the upstream RAISE WARNING typo fix for 0.1.0.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.01817161514logical_ddl-
RPMPIGSTY0.1.01817161514logical_ddl_$v-
DEBPIGSTY0.1.01817161514postgresql-$v-logical-ddl-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d13.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d13.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u22.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u22.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u24.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u24.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0

构建

您可以使用 pig build 命令构建 logical_ddl 扩展的 RPM / DEB 包:

pig build pkg logical_ddl         # 构建 RPM / DEB 包

安装

您可以直接安装 logical_ddl 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install logical_ddl;          # 当前活跃 PG 版本安装
pig ext install -y logical_ddl -v 18  # PG 18
pig ext install -y logical_ddl -v 17  # PG 17
pig ext install -y logical_ddl -v 16  # PG 16
pig ext install -y logical_ddl -v 15  # PG 15
pig ext install -y logical_ddl -v 14  # PG 14
dnf install -y logical_ddl_18       # PG 18
dnf install -y logical_ddl_17       # PG 17
dnf install -y logical_ddl_16       # PG 16
dnf install -y logical_ddl_15       # PG 15
dnf install -y logical_ddl_14       # PG 14
apt install -y postgresql-18-logical-ddl   # PG 18
apt install -y postgresql-17-logical-ddl   # PG 17
apt install -y postgresql-16-logical-ddl   # PG 16
apt install -y postgresql-15-logical-ddl   # PG 15
apt install -y postgresql-14-logical-ddl   # PG 14

创建扩展

CREATE EXTENSION logical_ddl;

用法

logical_ddl 会捕获表上受支持的 DDL 变更,并通过内置逻辑复制进行回放。这个项目的目标是减少手工执行 DDL 的次数,并避免发布端和订阅端之间的模式漂移。

README 指出,PostgreSQL 11 及以上版本受支持,且扩展需要在超级用户权限下运行。

捕获内容

支持的 DDL 操作包括:

  • ALTER TABLE ... RENAME TO ...
  • ALTER TABLE ... RENAME COLUMN ... TO ...
  • ALTER TABLE ... ADD COLUMN ...
  • ALTER TABLE ... ALTER COLUMN ... TYPE ...
  • ALTER TABLE ... DROP COLUMN ...

README 还说明,内置类型、数组、复合类型、域和枚举都受支持,但复合类型、域和枚举的定义本身不会被复制。

发布端

CREATE EXTENSION logical_ddl;
INSERT INTO logical_ddl.settings VALUES (true, 'source1');
INSERT INTO logical_ddl.publish_tablelist (relid) VALUES ('table1'::regclass);
ALTER PUBLICATION log_pub_1 ADD TABLE logical_ddl.shadow_table;

扩展通过事件触发器捕获 DDL,把结果存入 logical_ddl.shadow_table,再通过逻辑复制发布这张表。

订阅端

CREATE EXTENSION logical_ddl;
INSERT INTO logical_ddl.settings VALUES (false, 'source1');
INSERT INTO logical_ddl.subscribe_tablelist (source, relid) VALUES ('source1', 'table1'::regclass);
ALTER SUBSCRIPTION log_sub_1 REFRESH PUBLICATION;

在订阅端,扩展会监听传入的 DDL 记录,并把生成的 SQL 回放到目标表上。

数据模型

  • logical_ddl.settings 控制节点是发布端、订阅端,还是两者兼具。
  • logical_ddl.publish_tablelist 控制要捕获哪些表和命令类型。
  • logical_ddl.subscribe_tablelist 控制哪些表接收回放后的 DDL。
  • logical_ddl.shadow_table 存储已捕获的命令。
  • logical_ddl.applied_commands 跟踪生成的 SQL 以及执行是否失败。

注意事项

  • DDL 支持范围仅限于上面列出的操作。
  • 默认表达式、约束、索引以及 USING 表达式都未实现。
  • README 提到该项目仍在开发中,后续可能出现不兼容变更。

范围

上游 README 已经足以说明扩展模型、可捕获的 DDL 类型、发布端/订阅端配置以及已知限制,因此不需要额外的文档页或主页。


最后修改 2026-04-14: update extension catalog (fa7cf58)