logical_ddl
在 PostgreSQL 逻辑复制中复制受支持的 DDL 变更
仓库
samedyildirim/logical_ddl
https://github.com/samedyildirim/logical_ddl
源码
logical_ddl-0.1.0.tar.gz
logical_ddl-0.1.0.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
logical_ddl | 0.1.0 | ETL | MIT | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 9530 | logical_ddl | 否 | 是 | 否 | 是 | 否 | 否 | logical_ddl |
Pigsty carries the upstream RAISE WARNING typo fix for 0.1.0.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.1.0 | 1817161514 | logical_ddl | - |
| RPM | PIGSTY | 0.1.0 | 1817161514 | logical_ddl_$v | - |
| DEB | PIGSTY | 0.1.0 | 1817161514 | postgresql-$v-logical-ddl | - |
构建
您可以使用 pig build 命令构建 logical_ddl 扩展的 RPM / DEB 包:
pig build pkg logical_ddl # 构建 RPM / DEB 包
安装
您可以直接安装 logical_ddl 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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;
用法
- GitHub 仓库:
samedyildirim/logical_ddl - README: samedyildirim/logical_ddl/blob/master/README.md
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 类型、发布端/订阅端配置以及已知限制,因此不需要额外的文档页或主页。