创建列存镜像表
在 pg_mooncake 中,列存表通过 mooncake.create_table 存储过程创建,作为现有 PostgreSQL 行存表(普通堆表或分区表)的**实时同步镜像(Columnstore Mirror)**运行。
存储过程签名
| 参数名称 | 类型 | 默认值 | 参数说明 |
|---|---|---|---|
dst |
text |
(必填) | 要创建的目标列存镜像表名称(支持 schema.table 格式,未指定 Schema 时默认为 public)。 |
src |
text |
(必填) | 作为复制源的 PostgreSQL 行存表或分区父表名称(支持 schema.table 格式)。 |
src_uri |
text |
NULL |
当从外部远程 PostgreSQL 实例复制时,指定远程连接串(postgresql://user:pass@host:port/dbname)。为 NULL 时默认从当前本地数据库复制。 |
table_config |
json |
NULL |
可选的 JSON 配置对象,用于定制 Moonlink 表级摄取与存储参数(例如 write_buffer_size)。 |
src_uri(而非 source_uri)上游早期 v0.2 文档中存在一处笔误,将远程连接参数写成了 source_uri => 'postgresql://...'。在 pg_mooncake 的真实 SQL 定义(src/functions.rs)中,该参数的准确名称为 src_uri。使用命名参数调用时请务必传入 src_uri => 'postgresql://...'。
1. 为当前数据库中的本地表创建镜像
省略 src_uri(或传 NULL)时,pg_mooncake 直接镜像当前数据库内的 src 表:
执行 CALL mooncake.create_table('orders_analytics', 'orders') 时后台完成的步骤:
pg_mooncake读取orders的列结构,并创建CREATE TABLE orders_analytics (...) USING mooncake。- 如果
orders没有主键,pg_mooncake会自动执行ALTER TABLE orders REPLICA IDENTITY FULL(在v0.3.0中,若orders是分区表,还会自动为所有现有叶子子分区设置REPLICA IDENTITY FULL)。 moonlink建立逻辑复制槽(pgoutput),完成orders存量行的初始快照拷贝,并开始实时流式同步后续的INSERT、UPDATE与DELETE变更。
2. 从远程 PostgreSQL 实例镜像表(src_uri)
你可以在独立的分析型 PostgreSQL 节点上部署 pg_mooncake,并通过 src_uri 实时镜像远程生产 PostgreSQL 数据库(包括自建实例、AWS RDS、Aurora、Supabase 或 Neon)中的业务表:
远程源数据库需满足以下条件:
- 已开启逻辑复制:
wal_level = logical。 src_uri中的数据库用户具备REPLICATION权限以及源表src的SELECT权限。- 若源表没有主键,需在源表上设置
REPLICA IDENTITY FULL。
3. 为分区表创建列存镜像
mooncake.create_table 原生支持 PostgreSQL 声明式分区表(PARTITION BY RANGE、LIST 或 HASH)。调用时只需将分区父表名称作为 src 传入:
create_table 之后新增子分区的注意事项在 pg_mooncake 0.3.0 中,mooncake.create_table 会自动为创建镜像时已存在的所有叶子子分区设置 REPLICA IDENTITY FULL。如果在创建镜像之后又新增了子分区(例如 CREATE TABLE events_2026_12 PARTITION OF events ...)且表没有主键,请在对新分区执行 UPDATE 或 DELETE 前手动执行 ALTER TABLE events_2026_12 REPLICA IDENTITY FULL;。
4. 高级 table_config 参数配置
你可以通过 table_config 传入 JSON 对象来定制单表级 Moonlink 行为(对应 moonlink_backend/src/table_config.rs 中的 TableConfig 结构),包括纯追加(Append-Only)模式、后台合并开关,以及自定义本地文件系统 / S3 / GCS 存储后端:
| JSON 字段路径 | 类型 | 默认值 | 参数说明 |
|---|---|---|---|
mooncake.append_only |
bool |
false |
设为 true 时将表视为纯追加模式,跳过维护主键哈希索引以提升写入吞吐。 |
mooncake.skip_index_merge |
bool |
false |
设为 true 时禁用后台 Puffin 哈希索引 LSM 树合并。 |
mooncake.skip_data_compaction |
bool |
false |
设为 true 时禁用后台 Parquet 数据文件自动合并(Compaction)。 |
iceberg.storage_config |
object |
{"fs": {"root_directory": "$PGDATA/pg_mooncake"}} |
Apache Iceberg v2 元数据与 Parquet 数据文件的存储后端(支持 fs、s3 或 gcs)。 |
wal.storage_config |
object |
{"fs": {"root_directory": "$PGDATA/pg_mooncake"}} |
Moonlink 内部 WAL 日志段的存储后端(支持 fs、s3 或 gcs)。 |
5. 删除列存镜像表
如需删除列存镜像表并自动清理其 Moonlink 元数据与逻辑复制槽,直接执行标准的 DROP TABLE 即可: