PostgreSQL实现数据表跨库同步的四种方案
作者:雷工笔记
要实现一个 PG 库的表数据变化(增删改),实时 / 定时同步到另一个独立 PG 库,豆老师给整理了生产环境最常用、最稳定的 4 种方案。
一、最简单:触发器 + 外部表(dblink/foreign table)
适合小数据量、单表同步、实时性要求高的场景,无需额外组件,纯 PG 原生实现。
实现原理
1、源库表创建触发器,数据增删改时触发
2、触发器调用函数,通过 dblink 连接目标库
3、自动执行同步 SQL,实时写入目标库
核心步骤
1、源库安装扩展
-- 源库执行 CREATE EXTENSION IF NOT EXISTS dblink;
2、创建同步函数(源库)
CREATE OR REPLACE FUNCTION sync_table_func() RETURNS TRIGGER AS $$ BEGIN -- 连接目标库:替换为你的目标库信息 PERFORM dblink_connect( 'dbname=目标库名 host=目标IP port=5432 user=账号 password=密码' ); -- INSERT 同步 IF (TG_OP = 'INSERT') THEN PERFORM dblink_exec( 'INSERT INTO 目标表名 VALUES ($1.*)', NEW ); -- UPDATE 同步 ELSIF (TG_OP = 'UPDATE') THEN PERFORM dblink_exec( 'UPDATE 目标表名 SET 字段1=$1,字段2=$2 WHERE id=$3', NEW.字段1, NEW.字段2, OLD.id ); -- DELETE 同步 ELSIF (TG_OP = 'DELETE') THEN PERFORM dblink_exec( 'DELETE FROM 目标表名 WHERE id=$1', OLD.id ); END IF; PERFORM dblink_disconnect(); RETURN COALESCE(NEW, OLD); END; $$ LANGUAGE plpgsql;
3、绑定触发器到源表
CREATE TRIGGER trigger_sync_table AFTER INSERT OR UPDATE OR DELETE ON 源表名 FOR EACH ROW EXECUTE FUNCTION sync_table_func();
优点
①纯 PG 原生,零部署、零学习成本
②实时同步,延迟极低
③单表配置快速
缺点
①大并发、大数据量会影响源库性能
②目标库不可用时,源库会报错
③不适合批量操作、分表同步
二、最常用:逻辑复制(Logical Replication)
PG 10+ 原生自带,生产标准方案,适合实时同步、多表、大数据量。
核心优势
①不影响源库性能
②目标库断开重连后自动续传,不丢数据
③支持整库 / 多表 / 指定表同步
④官方支持,稳定可靠
最简配置(3 步)
1、源库配置(postgresql.conf)
wal_level = logical # 必须修改 max_replication_slots = 10 max_wal_senders = 10
重启 PG 生效。
2、源库创建发布端
-- 创建发布(同步指定表) CREATE PUBLICATION pub_target FOR TABLE 表1, 表2; -- 授权复制权限 ALTER ROLE 账号 REPLICATION; 3、目标库创建订阅端 sql -- 创建订阅,自动同步数据 CREATE SUBSCRIPTION sub_source CONNECTION 'host=源IP port=5432 dbname=源库 user=账号 password=密码' PUBLICATION pub_target;
✅ 完成:源表任何变化都会实时同步到目标库。
三、企业级:Debezium + Kafka(CDC 方案)
适合高并发、分布式、多系统订阅同一份数据的场景(微服务架构)。
原理
①Debezium 监听 PG WAL 日志
②把数据变化发送到 Kafka
③目标库 / 其他系统消费消息同步
优点
①完全解耦,不影响业务库
②支持多目标同步
③可回溯数据变更历史
④大数据架构标配
缺点
①部署复杂(需要 Kafka、Debezium)
②小项目没必要
四、定时同步:pg_dump + cron /pg_clogSync
适合非实时、每天 / 每小时同步、对延迟不敏感的场景。
方案 1:定时全量同步(简单)
源库导出
pg_dump -h 源IP -U 用户 -d 库 -t 表 -F c -f dumpfile
目标库恢复
pg_restore -h 目标IP -U 用户 -d 库 -t 表 dumpfile
配合 Linux crontab 定时执行。
方案 2:增量同步(pg_clogSync)
只同步变化的数据,效率高,适合大表。
方案选择建议
场景 | 推荐方案 | 难度 |
|---|---|---|
单表、小数据、实时 | 触发器 + dblink | ⭐ |
多表、生产、实时 | 逻辑复制(首选) | ⭐⭐ |
微服务、多系统同步 | Debezium + Kafka | ⭐⭐⭐⭐ |
非实时、定时同步 | pg_dump 定时任务 | ⭐⭐ |
最推荐:逻辑复制(生产 90% 场景用它)
优点碾压其他方案:
①官方原生、稳定
②实时、不丢数据
③对源库几乎无性能损耗
④配置 5 分钟搞定
四、总结
1、新手 / 小项目:直接用 触发器 + dblink,最快上线
2、生产环境:优先 逻辑复制,稳定、高效、零侵入
3、分布式架构:用 Debezium CDC
4、非实时同步:用 定时 pg_dump
以上就是PostgreSQL实现数据表跨库同步的四种方案的详细内容,更多关于PostgreSQL数据表跨库同步的资料请关注脚本之家其它相关文章!
