亲手创建你的第一张 USING mooncake 列存镜像表,体验事务写入、更新、回滚与跨表关联查询。
这是本节的多页打印视图。 .
快速开始与安装指南
- 1: Hello World 快速上手教程
- 2: 已知限制说明
本指南介绍如何在 PostgreSQL 14、15、16、17 与 18 上安装 pg_mooncake(v0.3.0)(内嵌 moonlink(v0.0.1) 与 duckdb_mooncake(v0.0.2))及其依赖的 pg_duckdb(v1.2.0)。
1. 使用 Pigsty 安装二进制软件包(推荐)
在主流 Linux 发行版(el8、el9、el10、d12、d13、u22、u24、u26 × x86_64 / aarch64)上,最快、最可靠的安装方式是使用由 PGSTY 维护的 pig 包管理器。完整的各平台直链下载表请参阅下载与可用性矩阵。
2. 配置 postgresql.conf 并启用扩展
pg_mooncake 依赖 PostgreSQL 逻辑复制将行存表的增量变更实时同步至 Moonlink,并通过 pg_duckdb 加载本地打包的 mooncake.duckdb_extension。请在 postgresql.conf(或通过 ALTER SYSTEM)中配置以下参数:
重启 PostgreSQL 服务(例如 sudo systemctl restart postgresql-18 或 pig pg restart),随后使用 psql 连接目标数据库并创建扩展:
pg_duckdb 1.2.0 版本守卫说明在执行 CREATE EXTENSION pg_mooncake 时,扩展初始化 SQL 脚本会显式校验 pg_extension 中的 pg_duckdb 版本必须为 1.2.0。如果当前环境安装了不兼容的 pg_duckdb 版本(例如 1.1.x 或 1.3.x),安装将立即报错中止。请始终同步升级 pg_duckdb 与 pg_mooncake。
3. 从源码编译构建(v0.3.0)
如果你需要从源码构建 pg_mooncake 0.3.0、pg_duckdb 1.2.0、duckdb_mooncake v0.0.2 与 moonlink v0.0.1:
编译前置依赖
- PostgreSQL 开发头文件:
postgresql-server-dev-14至18(或postgresql17-devel/postgresql18-devel) - C/C++ 构建工具链:
cmake、ninja-build、g++或clang、libssl-dev、libcurl4-openssl-dev、liblz4-dev、libzstd-dev、protobuf-compiler(protoc) - Rust 工具链:Rust
1.99.0+(stable)以及严格匹配版本的cargo-pgrx0.19.3:
克隆仓库、校验版本锁并编译安装
4. Docker 容器镜像(Obsolete)
Obsolete(过时,待更新维护):PGSTY 尚未发布 pg_mooncake 0.3.0 的 Docker 与 Kubernetes 镜像。以下上游历史命令使用的是旧版 mooncakelabs/pg_mooncake 镜像(内置 PostgreSQL 17 与早期版本 pg_mooncake),仅供历史参考。
下一步
了解关于主键 / 复制标识、分区表行为、TRUNCATE 以及受支持 DDL 变更的工程约束。
1 - Hello World 快速上手教程
本教程将带你体验 pg_mooncake 的核心操作流程:创建标准的 PostgreSQL 行存表,创建实时同步的列存镜像表(USING mooncake),执行事务级 INSERT、UPDATE、DELETE 与 ROLLBACK,以及在列存镜像表与常规行存表之间执行混合 JOIN 查询。
1. 启用扩展
连接目标 PostgreSQL 数据库,确保已启用 pg_mooncake(及依赖的 pg_duckdb):
2. 创建行存表与实时列存镜像表
首先创建一张标准的 PostgreSQL 行存表(user_activity)用于承载业务写入,随后调用 mooncake.create_table 创建它的实时列存镜像表(user_activity_columnstore):
在后台,mooncake.create_table 会自动创建 user_activity_columnstore USING mooncake 表,为 user_activity 建立逻辑复制槽,并将表元数据注册到 moonlink 引擎中。
3. 执行插入、更新与删除操作
所有写操作(INSERT、UPDATE、DELETE)均针对原始行存表(user_activity)执行,而分析型 SELECT 查询则针对列存镜像表(user_activity_columnstore)执行:
查询输出:
4. 事务一致性与回滚验证
Moonlink 仅从逻辑复制流中摄取已提交的 PostgreSQL 事务;未提交或已回滚(ROLLBACK)的事务绝不会出现在列存镜像表中:
5. 列存表与行存表混合关联(JOIN)
你可以在两张列存镜像表之间执行关联查询,也可以在单条 SQL 中将 USING mooncake 列存镜像表与常规 PostgreSQL 行存表直接 JOIN:
6. 查看复制状态并生成 Iceberg 快照
通过 mooncake.list_tables() 查看当前的提交 LSN、刷盘 LSN 及 Iceberg 仓库目录,或调用 mooncake.create_snapshot 将内存 Arrow 写缓冲区强制刷盘并生成新的 Apache Iceberg v2 快照:
2 - 已知限制说明
在生产环境部署使用 pg_mooncake(v0.3.0)之前,请仔细阅读以下架构约束与当前已知限制。
1. 列存镜像表为只读副本
通过 CALL mooncake.create_table(dst, src) 创建的表采用 USING mooncake 表访问方法,本质上是只读列存镜像表:
- 不能直接对
USING mooncake列存表执行INSERT、UPDATE、DELETE或COPY(PostgreSQL 将直接拒绝修改)。 - 所有数据写入和修改必须针对源行存表(
src)执行,变更会通过moonlink逻辑复制自动同步至列存镜像。
2. 主键与 REPLICA IDENTITY FULL 要求
为了通过 PostgreSQL 逻辑复制准确同步 UPDATE 与 DELETE 操作,源表必须在 WAL 日志中提供完整的旧行标识:
- 包含主键(Primary Key)的源表:开箱即用,直接利用主键标识行。
- 不包含主键的普通源表:
CALL mooncake.create_table(dst, src)会在启动复制前自动对源表执行ALTER TABLE src REPLICA IDENTITY FULL。 - 分区源表(
v0.3.0行为说明):- 在
pg_mooncake 0.3.0中,对没有主键的分区表调用mooncake.create_table时,会自动为分区父表以及所有现有叶子子分区设置REPLICA IDENTITY FULL(修复了早期版本中子分区UPDATE事件缺少完整旧元组导致复制工作进程 Panic 的缺陷)。 - 重要提示:如果在
mooncake.create_table创建镜像之后又新增了子分区(CREATE TABLE ... PARTITION OF ...),在向该新分区执行UPDATE或DELETE之前,必须手动执行ALTER TABLE <new_partition> REPLICA IDENTITY FULL;。
- 在
3. TRUNCATE 行为说明
- 普通堆表:对已建立镜像的普通堆表执行
TRUNCATE不会同步清空列存镜像表。 - 分区表(冷热分层归档模式):对分区源表的单个旧子分区执行
TRUNCATE或DROP TABLE会被列存镜像表有意忽略。这一设计使你可以安全地从 PostgreSQL 行存中删除历史冷分区以释放本地磁盘,同时在列存镜像中完整保留全部历史数据。详见大表分区归档指南。
4. 表结构变更(ALTER TABLE)
目前仅以下针对源行存表的 ALTER TABLE 操作会自动同步至列存镜像表:
ALTER TABLE <src> ADD COLUMN <col> <type>(新增列)ALTER TABLE <src> DROP COLUMN <col>(删除列)
其他 DDL 变更(例如修改列类型 ALTER COLUMN ... TYPE 或重命名列 RENAME COLUMN)不会自动同步;如需执行复杂表结构变更,建议删除并重建列存镜像表(DROP TABLE <dst>; CALL mooncake.create_table('<dst>', '<src>');)。
5. 不支持的数据类型
pg_mooncake 支持所有常见的 PostgreSQL 数值、文本、布尔、日期/时间、UUID、JSON/JSONB 及常见数组类型,但以下类型暂不支持或存在限制:
- PostgreSQL 自定义枚举类型(
ENUM)、复合类型与域类型(DOMAIN) pg_duckdb尚未映射的几何类型与网络地址类型- 超出 DuckDB
DECIMAL(38, s)精度上限的超高精度NUMERIC值
6. mooncake.load_files 显式报错说明(SQLSTATE 0A000)
在 pg_mooncake 0.3.0 中,调用 CALL mooncake.load_files(dst, files) 会显式返回 SQLSTATE 0A000(ERRCODE_FEATURE_NOT_SUPPORTED:"mooncake.load_files is not implemented by the bundled Moonlink version")。
- 在早期上游版本中,内嵌 Moonlink 服务的
import_data处理器是一个空实现(no-op),会在未导入任何数据的情况下静默返回成功。 - 如需导入外部 Parquet 或 CSV 文件,请通过
COPY或INSERT INTO ... SELECT * FROM duckdb.read_parquet(...)写入源行存表,或者参考在 Postgres 中查询外部数据湖直接就地查询外部文件。