PostpreSQL内核学习-Chapter4 Foreign Data Wrapper(FDW)

news2024/10/6 12:27:43

FDW连接

preparations

  • 两个在不同主机(满足TCP/IP连接是分属于不同IP地址下)
  • (如果是安装PG源码)进入源码目录下面的/contrib/postgres_fdw/,然后用make & make install编译和安装
[root@localhost /]# cd 源码存放的目录/postgresql-15.3/contrib/postgres_fdw/
[root@localhost postgres_fdw]#  make & make install
  • (如果是yum安装)

Connection

[userb@localhost ~]$ psql -d my_second_pgdb
psql (15.3)
Type "help" for help.

# 1.创建拓展
my_second_pgdb=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION

my_first_pgdb=# \x
Expanded display is on.

my_first_pgdb=# select * from pg_foreign_data_wrapper;
-[ RECORD 1 ]+-------------
oid          | 16392
fdwname      | postgres_fdw
fdwowner     | 10
fdwhandler   | 16390
fdwvalidator | 16391
fdwacl       | 
fdwoptions   | 

my_first_pgdb=# select * from pg_extension;
-[ RECORD 1 ]--+-------------
oid            | 13673
extname        | plpgsql
extowner       | 10
extnamespace   | 11
extrelocatable | f
extversion     | 1.0
extconfig      | 
extcondition   | 
-[ RECORD 2 ]--+-------------
oid            | 16389
extname        | postgres_fdw
extowner       | 10
extnamespace   | 2200
extrelocatable | t
extversion     | 1.1
extconfig      | 
extcondition   | 



# 2. 创建目标库连接串,包含欲访问的外部表所在主机的IP地址,欲访问的数据库进程的端口号,数据库名称
# 关系型数据库常用默认端口号
# 1.Oracle数据库默认端口号为,1521; 
# 2.MySQL数据库默认端口号为,3306; 
# 3.SQLServer数据库默认端口号为,1433;
# 4.PostgreSQL数据库默认端口号为,5432;

my_second_pgdb=# CREATE SERVER server_a_my_first_pgdb FOREIGN DATA WRAPPER postgres_fdw OPTIONS(host 'xxx.xxx.xxx.xxx', port '5432', dbname 'my_first_pgdb');
CREATE SERVER
my_second_pgdb=# select * from pg_foreign_server;
-[ RECORD 1 ]----------------------------------------------------
oid        | 16396
srvname    | server_a_my_first_pgdb
srvowner   | 10
srvfdw     | 16392
srvtype    | 
srvversion | 
srvacl     | 
srvoptions | {host=xxx.xxx.xxx.xxx,port=5432,dbname=my_first_pgdb}




# 3. 用户映射:欲访问的外部表所属用户名、密码(OPTIONS中),将其映射到当前库的某一个用户(FOR关键字后面)上来
# 这里假设当前库的被映射的用户名为usera,也就是欲访问的外部表所属的用户;映射的用户名为userb,也就是当前库的其中一个用户。
# 查看数据库中的用户和(已MS5加密后的)密码:SELECT rolname,rolpassword FROM pg_authid;
# 修改用户密码:ALTER USER usera WITH PASSWORD 'useraaa';
# 这里被映射的用户一定要有密码,不然会报错

my_second_pgdb=# CREATE USER MAPPING FOR userb SERVER server_a_my_first_pgdb OPTIONS (user 'usera', password 'useraaa');
CREATE USER MAPPING
my_secondt_pgdb=# select * from pg_user_mappings;
-[ RECORD 1 ]----------------------------
umid      | 16401
srvid     | 16396
srvname   | server_a_my_first_pgdb
umuser    | 10
usename   | userb
umoptions | {user=usera,password=useraaa}




# 4. 创建外部表(相当于外部表在本地数据库的映射),欲访问外部表或外部视图的字段(列)信息,字段可以少于目标表或视图,取自己需要的
# 这里有一个schema(模式)的概念,默认所有的表都放在名为public的模式下,如果指定了模式的就放在指定模式下
# 字段可以选取内容的意思是,例如我的外部表本来有五列字段,但可以仅访问其中两列,将欲访问的写在下方即可

my_second_pgdb=# CREATE FOREIGN TABLE fdw_a_weather(city character varying(80), temp_hi integer) SERVER server_a_my_first_pgdb OPTIONS(schema_name 'public', table_name 'weather');
CREATE FOREIGN TABLE
my_second_pgdb=# select * from pg_foreign_table;
-[ RECORD 1 ]--------------------------------------
ftrelid   | 16402
ftserver  | 16396
ftoptions | {schema_name=public,table_name=weather}

Access Foreign Data

  • 注意查询时,外部表所在主机的数据库服务器也要开启,才能成功查询到。
my_second_pgdb=# select * from fdw_a_weather;
       city        | temp_hi 
-------------------+---------
 San Francisco     |      50
 Changsha          |      35
 Hainan Ledong     |      31
 Hainan Sanya      |      31
 Hainan Baoting    |      31
 Hainan Qiongzhong |      31
 Hainan Dongfang   |      31
 Hainan Lingshui   |      31
 Changsha          |      28
(9 rows)

连接FDW中可能遇到的问题

  1. failed: 没有到主机的路由
my_first_pgdb=# select * from fdw_a_weather;
2023-07-05 11:10:18.061 CST [3225] ERROR:  could not connect to server "server_a_my_first_pgdb"
2023-07-05 11:10:18.061 CST [3225] DETAIL:  connection to server at "xxx.xxx.xxx.xxx", port 5432 failed: 没有到主机的路由
		Is the server running on that host and accepting TCP/IP connections?
2023-07-05 11:10:18.061 CST [3225] STATEMENT:  select * from fdw_a_weather;
ERROR:  could not connect to server "server_a_my_first_pgdb"
DETAIL:  connection to server at "xxx.xxx.xxx.xxx", port 5432 failed: 没有到主机的路由
	Is the server running on that host and accepting TCP/IP connections?
  • 解决:可能防火墙没有放行数据库端口,这里以5432为例
# 查看已放行端口号
[root@localhost ~]# firewall-cmd --list-port
# 添加放行端口号5432
[root@localhost ~]# firewall-cmd --zone=public --add-port=5432/tcp --permanent
success
# 重新加载防火墙
[root@localhost ~]# firewall-cmd --reload
success
# 再次查看,添加成功
[root@localhost ~]# firewall-cmd --list-port
5432/tcp
  1. failed: 拒绝连接
my_first_pgdb=# select * from fdw_a_weather;
2023-07-05 11:13:52.810 CST [3225] ERROR:  could not connect to server "server_a_my_first_pgdb"
2023-07-05 11:13:52.810 CST [3225] DETAIL:  connection to server at "xxx.xxx.xxx.xxx", port 5432 failed: 拒绝连接
		Is the server running on that host and accepting TCP/IP connections?
2023-07-05 11:13:52.810 CST [3225] STATEMENT:  select * from fdw_a_weather;
ERROR:  could not connect to server "server_a_my_first_pgdb"
DETAIL:  connection to server at "xxx.xxx.xxx.xxx", port 5432 failed: 拒绝连接
	Is the server running on that host and accepting TCP/IP connections?
  • 解决方法:进入主机a外部表所属数据簇(Database Cluster)目录下,修改postgresql.conf文件,添加listen_addresses = '*';修改pg_hba.conf,添加host all all 0.0.0.0/0 trust,修改完记得重启数据库的服务器(如果是别的数据库,也是找到其配置文件的监听地址项进行修改)
[usera@localhost data]$ vim postgresql.conf 
[usera@localhost data]$ vim pg_hba.conf 
[usera@localhost ~]$ pg_ctl -D /pgdata/15.3/poc/data/ restart
  • 修改完如下图:

    在这里插入图片描述
  1. ERROR: relation “my_first_pgdb.weather” does not exist
my_first_pgdb=# select * from fdw_a_weather;
2023-07-05 11:42:22.321 CST [3225] ERROR:  relation "my_first_pgdb.weather" does not exist
2023-07-05 11:42:22.321 CST [3225] CONTEXT:  remote SQL command: SELECT city, temp_hi FROM my_first_pgdb.weather
2023-07-05 11:42:22.321 CST [3225] STATEMENT:  select * from fdw_a_weather;
ERROR:  relation "my_first_pgdb.weather" does not exist
CONTEXT:  remote SQL command: SELECT city, temp_hi FROM my_first_pgdb.weather

  • 错误原因:CREATE FOREIGN TABLE时,OPTIONS后面没有正确填写外部表所属的schema模式名称,PostgreSQL中默认模式名就是public,如果没有新建过别的模式名,就填public就行了,注意:模式这一概念在db之下

Chapter 4 Foreign Data Wrappers 外部数据封装)

4.1 Foreign Data Wrapper(FDW)

  • What is Foreign Data?——Firstly, a table on a remote server is called a foreign table in SQL/MED.(运行在远程服务器上的表称之为外部表) PostgreSQL’s Foreign Data Wrappers are that use SQL/MES to manage foreign tables which are similar to local tables.(外部数据封装器会用SQL/MES来管理类似本地表的外部表)
  • After installing the necessary extension and making the appropriate settings, you can access the foreign tables on the remote servers.(安装必须的拓展和进行合适的设置后,就可以访问远程服务器的外部关系表了) For example, suppose there are two remote servers, namaly, postgresql and mysql, which have foreign_pg_tbl table and foreign_my_tbl table, respectively. In this exmaple, you can access the foreign tables from the local server by issuing the SELECT queries as shown below.(假设有两个远程服务器,名字分别为postgresql和mysql,分别有两张关系表foreign_pg_tblforeign_my_tbl,下例中可以用SELECT查询在本地服务器上访问外部表)
  • Moreover, you can execute the join operation with the foreign tables stored in different servers which are similar to the local tables.(此外,和连接本地服务器上的关系表类似,还可以对存储在不同服务器上的外部表进行连接操作)
  • Many FDW extensions have been developed and listed in Postgres wiki. However, almost all extensions are not properly maintained except for postgres_fdw, which is officially developed and maintained by the PostgreSQL Global Development Group as an extension to access a remote PostgreSQL server.(目前已经开发了很多外部数据封装器拓展,都列在了Postgreswiki中,除了postgres_fdw几乎所有其他的fdw拓展都没有得到良好维护,postgres_fdw 作为提供给其他服务器的访问PG的拓展程序,是由PG全球开发小组开发并维护的)
  • PostgreSQL’s FDW is described in detail in the following sections. Section 4.1.1 presents an overview of the FDW in PostgreSQL. Section 4.1.2 describes how the postgres_fdw extension performs.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么truncate函数(四舍五入)是x+0.4999997而不是+0.5?

目录 float的不精确表示 0.5的舍入方法 该方法的漏洞 0.4999997f舍入的结果错误 以0.4999997f改进舍入方法 可以用0.49999996、0.49999998或者0.49999999替换0.49999997吗? 在做舍入函数研究时,发现函数中实现四舍五入的trunc函数大概采用的逻辑是floor(…

LVS负载均衡-----DR模式

目录 1.DR模式原理 2.DR 模式的特点: 3.LVS-DR中的ARP问题 问题原因: 解决方法: 问题二:返回报文时源地址使用VIP,导致网关设备的ARP缓存表紊乱 解决方法: 4.DR模式 LVS负载均衡群集部署 1.配置负…

python进程线程问题

参考链接: 代码可去原博文复制: python缩短大量数据处理时间-进程池pool()和map() 一 定义与解释 1、对于python代码,多线程其实是个假的,因为每次计算的时候,实质上只有一个线程计算。使用多线程时,是几…

【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测)

【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测) 文章目录 【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测&#xf…

中介者模式的学习与使用

1、中介者模式的学习 中介者模式是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合,使得它们可以独立地进行通信,而不需要直接相互引用。   在中介者模式中,有以下几个…

获取文件大小并转换单位

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【工具使用】Notepad++如何使用正则表达式同时搜索多个字符串

一,简介 在调试代码定位问题的时候,由于log打印比较多,故需要使用NotePad文本编辑器进行搜索,并且需要同时搜索多个字符串,本文介绍如何同时搜索多个字符串,供参考。 二,操作步骤 2.1 搜索设…

90、基于STM32单片机数字频率计频率检测配NE555脉冲发生器设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

如何基于 ESP-IDF SDK 为应用工程添加自定义的 menuconfig 编译条件设置?

在工程的 main 目录下添加 Kconfig.projbuild 文件对需要添加自定义设置的参数进行定义在应用代码中使用自定义设置的参数编写 Kconfig.projbuild 文件 在工程的 main 目录下添加 Kconfig.projbuild 文件 接下来会基于 esp-idf/examples/peripherals/uart/uart_async_rxtxtask…

Python黑魔法揭秘:超强公共操作符和推导式的编程技巧

文章目录 前言公共操作1.运算符1) 合并操作2)* 复制操作in / not in 判断数据在 / 不在容器中 公共方法len()del / del()max()min()range()enumerate() 容器类型转换1)list() 将某个序列转化为列表tuple() 将某个序列转换为元组set() 将某个序…

OpenCloudOS社区开源,助力软件开发

早前红帽宣布限制源代码访问性的政策,并解释说RHEL相关源码仅通过CentOS Stream公开,付费客户和合作伙伴可通过Red Hat Customer Portal访问到源代码,由此也导致非客户获取源码越来越麻烦, 据了解,CentOS是红帽发行的…

效率为王!项目管理软件如何帮你提高效率?

对于任何商业组织及其客户来说,低效率的员工和浪费的时间都是一个问题。团队成员懈怠会对团队的整体效率产生负面影响。除了巨大的财务挫折之外,这些问题的混合还导致多次延误、工作质量差和客户不满意。 但有了正确的项目管理软件,企业就可…

Netty各组件执行流程及原理

目录 一、netty执行流程 二、EventLoop 1、事件循环对象EventLoop 2、事件循环对象组EventLoopGroup 3、io任务 4、分工细化 5、handler执行中如何换的group 三、Channel 1、常用方法 2、channelFuture 3、为什么要异步 四、Future & Promise 1、jdk future …

Linux13.文件(上)

1.文件 内容 属性。 2.在程序中创建一个文件,文件是进程创建的(跑起来才有),默认路径是进程的工作路径。 3. C语言中字符串以\0结尾,文件不是。 4.指令 >文件 :清空文件。 5.理解cat指令的实现方式。 6.使用位操作传递宏标记位 7.操…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天,继续加油 今日案例来源:csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额,输出实际付款金额。购货折扣率如下: 购货金额≤500元…

skywalking linux安装部署

SkyWalking APM tar 下载 结合自己的es版本下载对应的tar 地址:https://archive.apache.org/dist/skywalking/ 由于我使用的是es7所以下载对应版本 拷贝对应链接使用wget下载 wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7…

Neon入门以及常用函数

什么是neon, neon是arm架构下的一个simd的一种方案, 本质上是一些可以用于simd的寄存器 具体参考官方的图: 官方的图说明对于arm开发板, 有16个128bit的寄存器,或者也可以看作是32个64bit的寄存器 列一下常用的neon…

从零开发短视频电商 使用nimbus-jose-jwt进行对称签名和非对称签名的JWT实现

文章目录 什么是JSON Web Token何时使用JSON Web TokenJSON Web Token的结构是什么头部(Header)负载(Payload)签名(Signature)拼接起来 如何使用JSON Web Token工具库依赖流程对称签名非对称签名 总结 JWT的…

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

Qt Quick系列(9)—初识画布

🚀作者:CAccept 🎂专栏:Qt Quick 文章目录 前言代码示例1源码关键知识点 代码示例2源码关键知识点 总结 前言 画布元素的基本思想是使用上下文2D对象(ctx)渲染路径。上下文2D对象包含必要的图形功能&…