PostgreSQL是否支持仅复制发布端表的指定列子集?
PostgreSQL逻辑复制同步表列子集方案
完全可行,PostgreSQL 10及以上版本的逻辑复制原生支持仅同步源表的部分列,不会抛出错误,只要满足基础配置要求即可,非常适配你只读订阅的场景。
核心配置要求
- 订阅端保留的列,列名、数据类型必须和源端对应列完全匹配
- 保留的列子集必须覆盖源表的
REPLICA IDENTITY对应列:- 源表
REPLICA IDENTITY为默认DEFAULT(即使用主键作为副本标识)时,订阅端表必须包含源表全部主键列 - 若源表无主键、或不想同步主键列,可将源表
REPLICA IDENTITY修改为FULL,该模式下无列强制要求,但更新、删除操作的同步效率会有所降低
- 源表
实操示例(对应你的product表场景)
假设源端product表包含大量业务无关列,你仅需要同步id、name、price三列:
- 源端配置发布(推荐PostgreSQL 11+使用列过滤,更节省带宽)
-- 源库执行,发布时直接指定需要同步的列 CREATE PUBLICATION product_pub FOR TABLE product (id, name, price);
如果你的PostgreSQL版本低于11,不支持发布端列过滤,直接正常发布整表即可,订阅端会自动忽略多余列。
- 订阅端建表
-- 订阅库执行,仅创建需要的列即可 CREATE TABLE product ( id INT PRIMARY KEY, name VARCHAR(200) NOT NULL, price NUMERIC(10,2) NOT NULL );
- 订阅端创建订阅
CREATE SUBSCRIPTION product_sub CONNECTION 'dbname=源库名 host=源库地址 user=复制用户 password=复制密码' PUBLICATION product_pub;
注意事项
- 只读场景下不需要处理写入冲突,该方案稳定性极强
- 后续需要新增同步列时,只需先在订阅端添加对应列(类型和源端一致,可自行设置默认值或允许为空),再在源端发布规则中添加对应列即可,不需要重新同步全量数据
- 不要修改订阅端同步列的列名、数据类型,否则会导致复制中断
内容的提问来源于stack exchange,提问作者coterobarros
相关产品推荐
相关产品推荐

