PostgreSQL跨库数据查询及同步,postgres_fdw操作

2024-02-19 06:48

本文主要是介绍PostgreSQL跨库数据查询及同步,postgres_fdw操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PostgreSQL跨库数据查询及同步,postgres_fdw操作

  • 安装插件及创建链接
  • 创建远程表映射
  • 查看已设置的内容
  • 删除fdw设置
  • 修改fdw设置
  • postgres官方原始设置 F.33.7. 例子
  • 其他参考内容

数据查询及同步原理: PostgreSQL跨库操作(dblink、postgres_fdw、mysql_fdw)

官方参考来源 http://www.postgres.cn/docs/11/postgres-fdw.html

安装插件及创建链接

--创建postgres_fdw插件
CREATE EXTENSION postgres_fdw;
--创建foreign server
CREATE SERVER datasyncreadFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '127.0.0.1', port '5432', dbname 'postgres');
--创建user mapping
CREATE USER MAPPING FOR datareadSERVER datasyncreadOPTIONS (user 'dataread', password 'p@12##s……!sWord');

创建远程表映射

--创建foreign table
CREATE FOREIGN TABLE ft_account (id integer NOT NULL,data text
)SERVER datasyncreadOPTIONS (schema_name 'public', table_name 'account');

查看已设置的内容

--查看 foreign server
SELECT * FROM pg_foreign_server;
--查看user mapping
SELECT * FROM pg_user_mappings;

删除fdw设置

--删除foreign table
DROP FOREIGN TABLE ft_account;
--删除user mapping
DROP USER MAPPING [ IF EXISTS ] FOR { user_name | USER | CURRENT_USER | PUBLIC } SERVER dataread;
--删除 foreign server
DROP SERVER dataread;

修改fdw设置

--修改foreign server配置
ALTER SERVER foo OPTIONS (set host 'readonly.com',set dbname 'readonly');
ALTER SERVER foo VERSION '8.4' OPTIONS (SET host 'readonly.com');
--修改user mapping
ALTER USER MAPPING FOR bob SERVER foo OPTIONS (user 'postgres', password 'Ap@12##s……!sWord');
--修改foreign table
ALTER FOREIGN TABLE ft_account ALTER COLUMN street SET NOT NULL;
ALTER FOREIGN TABLE public.ft_account OPTIONS (ADD opt1 'value', SET opt2, 'value2', DROP opt3 'value3');

postgres官方原始设置 F.33.7. 例子

F.33. postgres_fdw
F.33.1. postgres_fdw 的 FDW 选项
F.33.2. 连接管理
F.33.3. 事务管理
F.33.4. 远程查询优化
F.33.5. 远程查询执行环境
F.33.6. 跨版本兼容性
F.33.7. 例子
F.33.8. 作者F.33.7. 例子
这里是一个用postgres_fdw创建外部表的例子。首先安装该扩展:CREATE EXTENSION postgres_fdw;
然后使用CREATE SERVER创建一个外部服务器。在这个例子中我们希望连接到一个位于主机192.83.123.89上并且监听5432端口的PostgreSQL服务器。在该远程服务器上要连接的数据库名为foreign_db:CREATE SERVER foreign_serverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (host '192.83.123.89', port '5432', dbname 'foreign_db');
需要用CREATE USER MAPPING定义一个用户映射来标识在远程服务器上使用哪个角色:CREATE USER MAPPING FOR local_userSERVER foreign_serverOPTIONS (user 'foreign_user', password 'password');
现在就可以使用CREATE FOREIGN TABLE创建外部表了。在这个例子中我们希望访问远程服务器上名为some_schema.some_table的表。它的本地名称是foreign_table:CREATE FOREIGN TABLE foreign_table (id integer NOT NULL,data text
)SERVER foreign_serverOPTIONS (schema_name 'some_schema', table_name 'some_table');
CREATE FOREIGN TABLE中声明的列数据类型和其他性质必须要匹配实际的远程表。列名也必须匹配,不过也可以为个别列附上column_name选项以表示它们在远程服务器上对应哪个列。在很多情况中,要手工构造外部表定义,使用IMPORT FOREIGN SCHEMA会更好。

其他参考内容

PostgreSQL-11.3-postgres-FDW-配置和体验1 摘要
本文首先总结了工作中配置postgres-fdw的关键步骤,然后针对外表查询的几个典型场景,记录了每一种场景下,主节点是如何下推查询到外节点的。2 环境配置
配置两台数据库服务器:node1:5432, node2:6432
使用默认数据库: postgresnode1                                  node2 |--------------------|                 |-------------------||        user=user1 --------------------> user=user2       || local table:   t0  |                 |                   || foreign table: t1 --------------------> local table: t1  ||                    |                 |                   || foreign table: t2 --------------------> local table: t2  | |--------------------|                 |-------------------|
2.1 配置node2:
node2上创建数据库账号'user2'
node2上建立两个表: t1, t2
2.1.1 使用超级用户登录node2,在node2上创建数据库账号'user2'
psql -h node2 -p 6432 -d postgres 
CREATE ROLE user2 WITH LOGIN PASSWORD 'pwd#@1';
GRANT ALL PRIVILEGES ON DATABASE postgres to user2;
2.1.2 更改node2:pg_hba.conf,允许node1使用账号user2访问node2
node1的IP地址:192.168.199.110
host    postgres        user2           192.168.199.110/32      md5
2.1.3 在node2上,以user2身份,创建表: t1, t2
psql -h node2 -p 6432 -d postgres -U user2 
create table t1 ( id int, name varchar(100));create table t2 ( id int, name varchar(100));
2.2 配置node1
node1: 创建数据库账号'user1'
node1: 建立一个本地表t0,两个外表: t1, t2,分别指向node2上的t1, t2
2.2.1 使用超级用户,在node1上启用postgres-fdw, 创建数据库账号'user1'
psql -h node1 -p 5432 -d postgres 
create extension postgres_fdw;CREATE ROLE user1 WITH LOGIN PASSWORD '#@1qw';
GRANT ALL PRIVILEGES ON DATABASE postgres to user1;
grant usage on foreign data wrapper postgres_fdw to user1;
2.2.2 node1上,以user1登录
psql -h node1 -p 5432 -d postgres -U user1 
2.2.3 node1上,使用user1账号,创建本地表: t0
create table t0 ( id int, name varchar(100));
2.2.4 node1上,使用user1账号,创建外表:t1, t2
;;外表t1,t2
node1.t1 ---> node2.t1
node1.t2 ---> node2.t2
create server fnode2foreign data wrapper postgres_fdwoptions (host 'node2', port '6432', dbname 'postgres');create user mapping for user1server fnode2options (user 'user2', password 'pwd#@1'); create foreign table t1 (id int,name varchar(100)
)
server fnode2
options (schema_name 'public', table_name 't1');create foreign table t2 (id int,name varchar(100)
)
server fnode2
options (schema_name 'public', table_name 't2');2.3 加载数据,
通过节点node1,分别向node1的三个表(node1.t0, node1.t1,node1.t2)插入数据
三个表的数据相同,每个表有100条数据
insert into t0 select generate_series(1,100), 'tom-'||generate_series(1,100) ;
insert into t1 select generate_series(1,100), 'tom-'||generate_series(1,100) ;
insert into t2 select generate_series(1,100), 'tom-'||generate_series(1,100) ;
三个表的数据相同:id            name
----------------------
1             tom-1
2             tom-2
3             tom-3
...            ...
3. 探索外表查询
3.1 node1单外表扫描
node1.t1是外表
通过node1,查询t1
node1把查询,连带查询条件,推送到node2
node1上执行查询:psql -h node1 -U user1 -d postgres -c "select * from t1 where id=1;"
node2的执行过程如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DECLARE c1 CURSOR FOR SELECT id, name FROM public.t1 WHERE ((id = 1));
FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;
3.2 node1上:单外表+单本地表join,推送到外表时无过滤条件(where)
t0是本地表
t1是外表
在node1上执行查询psql -h node1 -U user1 -d postgres -c "select * from t0,t1 where t0.id=1 and t0.name=t1.name;"
下推到node2的查询如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DECLARE c1 CURSOR FOR SELECT id, name FROM public.t1;
FETCH 100 FROM c1;
FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;
3.3 node1上:单外表+单本地表join,推送到外表时带有过滤条件(where)
t0是本地表
t1是外表
在node1上执行查询:psql -h node1 -U user1 -d postgres -c "select * from t0,t1 where t1.id=1 and t0.name=t1.name;"
下推到node2的查询如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;DECLARE c1 CURSOR FORSELECT id, name FROM public.t1 WHERE ((id = 1));FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;
3.4 node1上,双外表join
t1是外表
t2是外表
通过node1执行:psql -h node1 -U user1 -d postgres -c "select * from t1,t2 where t1.id=1 and t1.name=t2.name;"
下推到node2的查询如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;DECLARE c1 CURSOR FORSELECT r1.id, r1.name, r2.id, r2.name FROM (public.t1 r1 INNER JOIN public.t2 r2 ON (((r1.name = r2.name)) AND ((r1.id = 1))));FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;
3.5 node1上,对外表avg()
t1是外表
通过node1执行:psql -h node1 -U user1 -d postgres -c "select avg(id) from t1 where id<100;"
下推到node2的查询如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DECLARE c1 CURSOR FORSELECT avg(id) FROM public.t1 WHERE ((id < 100));FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;
3.6 node1上,对外表sort
t1是外表
通过node1执行:psql -h node1 -U user1 -d postgres -c "select * from t1 where id<100 order by name;"
下推到node2的查询如下:START TRANSACTION ISOLATION LEVEL REPEATABLE READ;DECLARE c1 CURSOR FORSELECT id, name FROM public.t1 WHERE ((id < 100)) ORDER BY name ASC NULLS LAST;FETCH 100 FROM c1;
CLOSE c1;
COMMIT TRANSACTION;

这篇关于PostgreSQL跨库数据查询及同步,postgres_fdw操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723833

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X