postgresql FDW概念、用法与原理小结

news2024/11/12 21:11:12

最近突然遇到了一批使用fdw的场景,整理记录一把。

一、 强大的FDW

       FDW (foreign-data wrapper,外部数据包装器),可以让我们在PG中使用SQL查询极为丰富的外部数据:

  • 本实例和其他pg实例中的pg库
  • 主流关系型数据库:Oracle、MySQL、SQL Server等
  • NoSQL数据库:ClickHouse、MongoDB、Redis、Neo4j等
  • 外部文件:csv、josn、pg_dump、xml
  • Web文件:S3、TwitterFacebook
  • 更多类型参考:Foreign data wrappers - PostgreSQL wiki

二、 FDW四件套

下面的例子希望从本实例的postgres库访问clair库的layer表

首先在目标库创建一个用户,并授权它可以查询layer表

psql -dclair
create user clair_r with password '123456';
grant select on public.layer to clair_r;

按照四部曲:

1. create extension

处理外部数据源的插件,每类数据库各有不同,需要分别安装。

创建语句

create extension postgres_fdw;
  • 使用yum安装的,需要执行yum install postgresql-contrib安装对应版本包
  • 使用源码安装的,需要在源码解压目录编译插件包,否则会有报错
clair=# create extension postgres_fdw;

ERROR:  could not open extension control file "/…/base/share/extension/postgres_fdw.control": No such file or directory

解决方法

  • cd /源码解压目录/contrib/postgres_fdw    如果不知道在哪,搜索postgres_fdw.control位置
  • make & make install
  • 不需重启,再次执行create extension postgres_fdw;

对应视图

select * from pg_foreign_data_wrapper;

查看插件

select * from pg_extension ;
或
\dx

删除语句

drop extension postgres_fdw;

2. create server

目标库连接串,要访问哪个ip、端口、db名

创建语句

CREATE SERVER clair_server
        FOREIGN DATA WRAPPER postgres_fdw
        OPTIONS (host '192.83.123.89', port '5432', dbname 'clair');

对应视图

select * from pg_foreign_server;
或
\des

删除语句

drop SERVER foreign_server;

3. create user mapping

用户映射:目标库使用哪个用户、密码,可以单独创建一个用户也可以用现有的

CREATE USER MAPPING FOR postgres
        SERVER clair_server
        OPTIONS (user 'clair_r', password '123456');

对应视图

select * from pg_user_mappings;
或
\deu+

删除语句

DROP USER MAPPING for user_name SERVER server_name;

4. create foreign table

本地外部表对应目标库哪张表或视图,外部表字段可以少于目标表和视图,只取自己需要的

CREATE FOREIGN TABLE fdw_layer(
        id integer NOT NULL,
        name character varying(128)
)
        SERVER clair_server
        OPTIONS (schema_name 'public', table_name 'layer');

对应视图 

select * from pg_foreign_table;

删除语句

drop FOREIGN TABLE foreign_table;

5. 查询外部表

\d fdw_layer
select * from fdw_layer;

三、 其他常见fdw用法

1. mysql_fdw

按照四部曲

create extension mysql_fdw;

CREATE SERVER mysql_server
        FOREIGN DATA WRAPPER mysql_fdw
        OPTIONS (host '192.83.123.89', port '3306', dbname 'mydb');

CREATE USER MAPPING FOR pg_rw
        SERVER mysql_server
        OPTIONS (user 'mydb_r', password '123456');

CREATE FOREIGN TABLE fdw_mysql_mytab (
    id int,
    name character varying(128)
)
SERVER mysql_server
OPTIONS (
    dbname 'mydb',
    table_name 'mytab'
);

查询外部表

psql -Upg_rw
select count(*) from fdw_mysql_mytab;

2. file_fdw

将csv格式的pg错误日志创建为外部表。file_fdw不需要用户映射,因此只有3步

create extension file_fdw;

CREATE SERVER log_server FOREIGN DATA WRAPPER file_fdw;

CREATE FOREIGN TABLE postgres_log
(
  log_time timestamp,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint
) SERVER log_server
OPTIONS (format 'csv', header 'false', filename '/data/postgresql-01.csv', delimiter ',', null'');

四、 fdw原理

以下内容来自:https://oyo-byte.github.io/2018/08/03/learn_about_pgfdw/

       实现FDW的核心是实现一组回调函数,其中最核心有7个。无论外部数据源自身能力如何, 这7个接口是实现通过外部表对象访问该数据源的必须接口,定义都位于fdwapi.h。

回调函数

PG中的调用时机

作用

GetForeignRelSize

优化器生成访问路径的过程中对外部表估算访问代价时

提供外部表对于计算访问代价所需的基础数据,如表的元组数以及元组的平均长度,并将这些数据保存在输入参数baserel的字段”rows”以及”width”中

GetForeignPaths

生成对外部表访问路径时

生成对目标外部表的访问路径(通过PG中的接口createforeignscanpath()生成)

GetForeignPlan

优化器生成扫描外部表的查询计划节点时

生成访问目标外部表的ForeignScan计划节点(通过PG中的接口make_foreignscan())

BeginForeignScan

执行器即将开始执行ForeignScan算子,进行该算子相关的初始化时

获取执行ForeignScan算子所需的信息,并将它们组织并保存在ForeignScanState中

IterateForeignScan

执行ForeignScan算子过程中需要获取下一元组时

读取外部数据源的一行数据,并将它组织为PG中的Tuple(即TupleTableSlot). 当该回调函数返回一个空的TupleTableSlot结构时, 迭代器停止迭代

ReScanForeignScan

执行Nested Loop过程中需要重置Inner Scan时(即Outter Scan需要向前推进一行时)

将外部数据源的读取位置重置回最初的起始位置

EndForeignScan

ForeignScan算子执行完成时

释放整个ForeignScan算子执行过程中占用的外部资源或FDW中的资源

  • Parser: 包含对SQL的语法解析,语义校验,查询重写
  • Optimizer:生成查询计划
  • Executor:按照火山模型执行查询计划的算子并向上返回数据

https://img-blog.csdnimg.cn/20200117161940130.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hlaHV5aV9Jbg==,size_16,color_FFFFFF,t_70

参考

PostgreSQL Insider - How to link to Oracle databases using oracle_fdw (part 1)

http://v0.pigsty.cc/pdf/fdw-pgconf-2019.pdf

学习PostgreSQL的FDW(#1) | oYo-Byte

https://oyo-byte.github.io/2018/10/07/how_to_write_a_pg_fdw/

Foreign data wrappers - PostgreSQL wiki

https://www.postgresql.org/docs/14/postgres-fdw.html

http://www.postgres.cn/docs/9.3/file-fdw.html

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

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

相关文章

装饰模式(decorator-pattern)

装饰模式(decorator-pattern) 文章目录装饰模式(decorator-pattern)一、手抓饼点餐系统二、要求进阶三、装饰模式概要四、装饰模式的优劣及应用场景1. 优点2.缺点3.应用场景一、手抓饼点餐系统 请设计一个手抓饼点餐系统,支持加配菜,比如里脊、肉松、火…

C++ STL

目录 1.STL诞生 2.STL概念 3.STL六大主件 4.STL容器 算法 迭代器 5.容器算法迭代器初识,vector 5.1vector存放内置数据类型, 5.2vector存放自定义数据类型,解引用.访问,指针->访问,存放自定义数据类型指针。迭代器…

LeetCode(Array)1365. How Many Numbers Are Smaller Than the Current Number

1.问题 Given the array nums, for each nums[i] find out how many numbers in the array are smaller than it. That is, for each nums[i] you have to count the number of valid j’s such that j ! i and nums[j] < nums[i]. Return the answer in an array. Examp…

多目标建模总结

1. 概述 在推荐系统中&#xff0c;通常有多个业务目标需要同时优化&#xff0c;常见的指标包括点击率CTR、转化率CVR、 GMV、浏览深度和品类丰富度等。为了能平衡最终的多个目标&#xff0c;需要对多个目标建模&#xff0c;多目标建模的常用方法主要可以分为&#xff1a; 多模…

Linux常用命令——top命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) top 显示或管理执行中的程序 补充说明 top命令可以实时动态地查看系统的整体运行情况&#xff0c;是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面&#xff0c;用热键可…

C primer plus学习笔记 —— 13、存储类别、内存管理

文章目录存储类别定义、声明和初始化的区别作用域翻译单元和文件链接属性存储期存储类别多文件共享全局变量函数的存储类别存储类别的选择分配内存&#xff08;malloc、free&#xff09;malloc和calloc创建数组方式free的重要性举例存储类别 int a 1; int *p &a; int ra…

【Stm32野火】:野火STM32F103指南者开发板烧写官方示例程序LCD无法点亮?LCD示例程序无法使用?

项目场景&#xff1a; 大家好&#xff0c;最近在使用野火STM32F103指南者开发板的时候发现官方的示例程序LCD驱动代码居然无法直接驱动LCD点亮&#xff0c;这让我百思不得其解&#xff0c;以下就是我的踩坑填坑的过程&#xff0c;希望对大家有所帮助。 野火官方资料下载文档链接…

systemd介绍

systemd是一个 Linux 系统基础组件的集合&#xff0c;提供了一个系统和服务管理器&#xff0c;运行为 PID 1 并负责启动其它程序。功能包括&#xff1a;支持并行化任务&#xff1b;同时采用 socket 式与 D-Bus 总线式激活服务&#xff1b;按需启动守护进程&#xff08;daemon&a…

与Oracle不一样的union

与Oracle不一样的union一、引言二、实验探寻union2.1 再现DM8案例2.2 再现Oracle案例2.3 实验结论一、引言 前三日&#xff0c;同事call我聊发文查询优化排序问题&#xff0c;当时联想到union自身的特性&#xff08;合并去重&#xff0c;默认排序输出结果集&#xff09;&#…

(考研湖科大教书匠计算机网络)第一章概述-第五节2:计算机网络体系结构之OSI参考模型和TCPIP参考模型

文章目录一&#xff1a;OSI参考模型&#xff08;1&#xff09;应用层&#xff08;Application Layer&#xff09;&#xff08;2&#xff09;表示层&#xff08;Presentation Layer&#xff09;&#xff08;3&#xff09;会话层&#xff08;Session Layer&#xff09;&#xff0…

STC32G 单片机系列通用定时器的用法及编程

STC32G单片机与STC15系列单片机一样有T0~T4共5个通用定时器。其功能大致相同&#xff0c;与STC15系列单片机定时器不同的是STC32G单片机的定时器每个都多了一个8位预分频器&#xff0c;如下&#xff1a;这样定时器可作为一个24位定时器使用&#xff0c;做计数器使用与分频器就没…

【Flink】浅谈Flink背压问题(1)

概述 在多线程的情况下有一个典型的模&#xff0c;型生产者消费者模型&#xff0c;该模型主要由生产者、消费者和一个大小固定的队列组成。生产者向队列发送数据&#xff0c;消费者从队列中取出数据并处理。 针对上述模型&#xff0c;如果队列属于有限长度&#xff0c;当消费者…

UE5执行Python脚本插件

1.启用UE5的Python脚本编辑器&#xff1a; 在Edit里面找到Plugins&#xff0c;然后打开插件管理器&#xff0c;搜索Python,找到 Python Editor Script Plugin并启用它。该插件也可能会自动启用&#xff08;至少我的UE5是这样的&#xff09;&#xff0c;如果已经自动启用&#…

python机器学习(一)算法学习的步骤、机器学习的应用及流程(获取数据、特征工程、模型、模型评估)

机器学习入门 机器学习中需要理论性的知识&#xff0c;如数学知识为微积分(求导过程&#xff0c;线性回归的梯度下降法)&#xff0c;线性代数(多元线性回归&#xff0c;高纬度的数据&#xff0c;矩阵等)&#xff0c;概率论(贝叶斯算法)&#xff0c;统计学(贯穿整个学习过程)&a…

Nginx使用(五)配置高可用集群示例

一、条件&#xff08;1&#xff09;需要两台Nginx服务器&#xff08;2&#xff09;需要keepalived&#xff08;3&#xff09;需要虚拟ip二、准备工作&#xff08;1&#xff09;需要两台服务器&#xff08;2&#xff09;在两台服务器安装nginx&#xff08;3&#xff09;在两台服…

Linux应用基础与实训小结

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

ElasticSearch安装及基本使用

文章目录0. 学习资料1. 概念2. 安装ESdocker安装1. **下载镜像**2. **创建实例**3. **浏览器访问&#xff1a;**4. 测试使用Kibana安装1. 下载镜像2. 创建实例3. 效果3. 检索_cat保存查询通过id查询乐观锁操作更新删除批量操作**导入测试数据**4. 进阶搜索基本检索参考文档基本…

将数据从Java Bean复制到另一个Java Bean

JavaBean复制的几种方式1&#xff1a;概述在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能 会需要一个和A完全相同新对象B&#xff0c;并且此后对B任何改动都不会影响到A中的值…

P2T: Pyramid Pooling T ransformer for Scene Understanding

论文链接&#xff1a; https://arxiv.org/abs/2106.12011 中文版本&#xff1a; https://mmcheng.net/wp-content/uploads/2022/08/22PAMI_P2T_CN.pdf 代码链接&#xff1a; https://github.com/yuhuan-wu/P2T P2T: Pyramid Pooling T ransformer for Scene Understanding一、摘…

2023年网络安全比赛--JavaScript安全绕过中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.使用渗透机场景kali中工具扫描服务器,将服务器上apache版本号作为flag提交; 2.使用渗透机场景windows7访问服务其场景中的网站(网站路径为IP/javascript),找到网站首页中flag并提交; 3.使用渗透机场景windows7根据第二题的…