PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > PostgreSQL数据表跨库同步

PostgreSQL实现数据表跨库同步的四种方案

作者:雷工笔记

文章详细介绍了四种用于实现PostgreSQL数据库表数据变化实时或定时同步到另一个独立PG库的方法,包括触发器+外部表、逻辑复制、Debezium+Kafka和pg_dump定时任务,针对不同场景和需求,推荐了最适合的方案,并详细阐述了各自的优点、适用场景、配置方法和使用注意事项

要实现一个 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数据表跨库同步的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文