PostgreSQL能否创建触发器实现跨不同数据库的数据插入同步?
PostgreSQL跨库自动同步插入数据方案
可以实现跨库触发同步,核心是借助PostgreSQL官方自带的postgres_fdw外部数据包装器打通跨库访问能力,再配合触发器实现自动同步,操作步骤如下:
操作步骤
- 在DBA库中安装postgres_fdw扩展
该扩展为PostgreSQL官方内置扩展,无需额外安装第三方组件:
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
- 创建指向DBB的外部服务
CREATE SERVER dbb_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS ( host 'DBB数据库所在主机IP/域名', port 'DBB服务端口,默认5432', dbname 'DBB' );
- 配置用户映射
将DBA中操作shopping表的用户映射到DBB中拥有shopping_hist表写入权限的用户:
CREATE USER MAPPING FOR CURRENT_USER SERVER dbb_server OPTIONS ( user 'DBB的用户名', password 'DBB对应用户的密码' );
- 在DBA创建映射DBB表的外部表
字段类型和长度需和DBB的shopping_hist完全一致:
CREATE FOREIGN TABLE shopping_hist_fdw ( id INT, name VARCHAR, amount NUMERIC ) SERVER dbb_server OPTIONS ( schema_name 'public', -- DBB中shopping_hist所在的schema,默认是public table_name 'shopping_hist' );
- 创建触发器函数
CREATE OR REPLACE FUNCTION sync_shopping_to_dbb() RETURNS TRIGGER AS $$ BEGIN INSERT INTO shopping_hist_fdw (id, name, amount) VALUES (NEW.id, NEW.name, NEW.amount); RETURN NEW; -- 如果不需要强一致,允许DBA插入成功即使DBB同步失败,可以取消注释下面的异常捕获逻辑 -- EXCEPTION WHEN OTHERS THEN -- RAISE NOTICE '同步到DBB失败,错误信息:%', SQLERRM; -- RETURN NEW; END; $$ LANGUAGE plpgsql;
- 绑定插入触发器到DBA的shopping表
CREATE TRIGGER trigger_shopping_after_insert AFTER INSERT ON shopping FOR EACH ROW EXECUTE FUNCTION sync_shopping_to_dbb();
注意事项
- 事务一致性:默认跨库操作在同一个事务内,若向DBB插入失败,DBA的shopping表插入也会回滚,保证数据一致性;如果需要弱化一致性可以打开触发器函数中的异常捕获配置。
- 性能影响:单条触发会引入跨库网络开销,适合写入量不大的场景;如果写入QPS很高,建议采用逻辑复制、定时增量同步等批量同步方案。
- 权限检查:需要确保DBB侧的用户对
shopping_hist有INSERT权限,DBA侧的操作用户有使用外部服务、操作外部表的权限。
内容的提问来源于stack exchange,提问作者Raul Quinzani
相关产品推荐
相关产品推荐

