前言
FDW是外部数据包装器,基于PG有这个功能,如果想要数据融合,很容易在PG上实现,只要开发对应的FDW功能即可.
1.什么是FDW?
FDW (foreign-data wrapper,外部数据包装器),PostgreSQL FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据,这些数据可以是外部的pg数据库,也可以oracle、mysql等数据库,甚至可以是文件。
Specific SQL Database Wrappers 基本上每种数据库、数据类型都有各自的fdw插件,访问oracle库有oracle_fdw, 访问mysql库有mysql_fdw等等。fdw插件可以直接安装或者下载安装 可以让我们在PostgreSQL 中使用SQL查询极为丰富的外部数据: 主流关系型数据库:Oracle、MySQL、SQL Server等 NoSQL数据库:ClickHouse、MongoDB、Redis、Neo4j等 外部文件:csv、josn、pg_dump、xml Web文件:S3、Twitter、Facebook…


2.FDW工作流
1.词法分析器为输入的SQL语句创建查询树 2.SQL的执行器通过网络连接到源端的数据库服务器 3.如果启用了use_remote_estimate选项,执行器会执行explain命令评估执行计划 4.执行器根据最优的执行计划,重新创建SQL语句

3.file_fdw
file_fdw插件为PG数据库提供了访问外部数据的能力,比如我们常见的文件csv,log等,该插件是内置在PG源码的contrib中。
3.1 安装插件
cd /pgccc/soft/postgresql-15.6/contrib

--编译安装 [root@centos79 contrib]# cd file_fdw [root@centos79 file_fdw]# make install

--再次确认插件 [root@centos79 ~]# cd /pgccc/pgsql-15/share/extension

--安装插件 postgres=# CREATE EXTENSION file_fdw;

3.2 生成file_fdw服务器
--先生成一个file_fdw服务器。 CREATE SERVER file_fdw_server FOREIGN DATA WRAPPER file_fdw;
3.3 创建外部表
-- 创建一个名为"example"的新表
CREATE TABLE example (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INT
);
-- 插入数据到"example"表中
INSERT INTO example (name, age) VALUES
('Alice', 25),
('Bob', 30),
('Charlie', 35);
-- 查询"example"表中的所有数据
SELECT * FROM example;
--导出到文件
\copy example to '/home/postgres/example.csv' with csv header delimiter ','
--创建一个外部数据表
CREATE FOREIGN TABLE csvTable (
id SERIAL,
name VARCHAR(100),
age INT
) SERVER file_fdw_server
OPTIONS (format 'csv', header 'true', filename '/home/postgres/example.csv', delimiter ',', null'');
csv文件放在了根目录下面。
csv里面有4列,从左往右命令。还可以设置有没有列名选择
header 'true' 有列名,csv的第一行不作为表的数据 header 'false' 没有列名,csv的第一行也作为表的数据
--再次查询,完全和一般的表类似 postgres=# select * from csvTable;

4.postgres_fdw
通过 postgres_fdw访问远程PostgreSQL数据库表。
步骤如下: 在源端(本地库)创建 postgres_fdw 插件 创建 foreign server 外部服务(即:指连接外部数据源的连接信息) 创建映射用户(映射用户指定了访问外部表的本地用户和远程用户信息) 创建外部表(外部表的表定义建议和远端表结构一致)
4.1 创建安装插件
本地库做如下的操作: --编译安装 [postgres@centos79 ~]$ cd /pgccc/soft/postgresql-15.6/contrib [postgres@centos79 contrib]$ cd postgres_fdw [postgres@centos79 postgres_fdw]$ make install --再次确认插件 [root@centos79 ~]# cd /pgccc/pgsql-15/share/extension

--postgres 超级用户登录 PostgreSQL [postgres@centos79 ~]$ psql postgres=# CREATE EXTENSION postgres_fdw; postgres=# \dx

4.2 权限配置
本地库做如下的操作: 若使用超级用户使用postgres_fdw可以跳过 普通用户使用postgres_fdw需要单独授权 GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO pgtest;
4.3 创建外部服务
本地库做如下的操作: 外部服务定义了远端PostgreSQL数据库的IP、端口、数据库连接信息 CREATE SERVER fdwpg2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'pg2host', port '5432', dbname 'devdb');
4.4 创建映射用户
本地库做如下的操作: 映射用户指定了连接源端 PostgreSQL 数据库的用户名和密码信息 CREATE USER MAPPING FOR pgtest SERVER fdwpg2 OPTIONS (user 'pg2user', password 'pg2user'); FOR:配置的用户为本地的数据库用户 OPTIONS :配置的是远端PostgreSQL数据库的用户和密码
4.5 创建外部表
--远端数据库创建测试表 CREATE TABLE pg2_fdw (id int4 ,info text) ; INSERT INTO pg2_fdw (id , info ) VALUES (1, 'a'),(2, 'b'); ---创建外部表(本地库) CREATE FOREIGN TABLE ft_fdw ( id int4, info text ) SERVER fdwpg2 OPTIONS (schema_name 'pg2user', table_name 'pg2_fdw'); 通过外部表访问远端数据表 注意:远端数据库pg_hba.conf文件需要允许本地库访问策略 select * from pg2_fdw;
4.5 其它特性
支持可写特性 从PostgreSQL 9.3 版本开始支持postgres_fdw 外部表可写的条件 创建映射用户时配置的远端数据库用户需要对远端表具有写权限 PostgreSQL 必须是 9.3及以上版本。 聚合函数下推 PostgreSQL 10 版本在 postgres_fdw 扩展模块中新增了一个可以将聚合、 关联操作下推到远端 PostgreSQL 数据库进行的特性。 它大幅度减少了从远程库传送到本地库的数据量, 提升了 postgres_fdw 外部表上聚合查询的性能。
5.总结
FDW的其它插件支持外部表方式访问mysql,oracle等数据库表数据,PG的FDW可以根据业务开发各种FDW把数据进行融合,比如数据迁移、异构DBMS之间的联动,是一个做数据整个的非常棒的功能
编辑推荐:
- PG外部数据包装神器FDW,都在这里了...03-14
- PG备份恢复学的这么差,试用期你都过不了03-14
- Postgresql生态03-14
- 使用plprofiler分析PostgreSQL函数各语句的执行情况03-14
- 掌握RockyLinux anacron命令(轻松实现非24小时运行的定时任务)03-14
- PG 学习教程03-14
- PostgreSQL数据脱敏插件介绍03-14
- PostgreSQL如何仅导出视图或函数及部分表03-14
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- PG外部数据包装神器FDW,都在这里了...
PG外部数据包装神器FDW,都在这里了...
26-03-14 - PG备份恢复学的这么差,试用期你都过不了
PG备份恢复学的这么差,试用期你都过不了
26-03-14 - Postgresql生态
Postgresql生态
26-03-14 - 使用plprofiler分析PostgreSQL函数各语句的执行情况
使用plprofiler分析PostgreSQL函数各语句的执行情况
26-03-14 - 掌握RockyLinux anacron命令(轻松实现非24小时运行的定时任务)
- PG 学习教程
PG 学习教程
26-03-14 - 改变数据页大小能带来多少收益?
改变数据页大小能带来多少收益?
26-03-14 - 如何配置PG的数据库缓冲
如何配置PG的数据库缓冲
26-03-14 - 聊聊postgresql的double buffering 问题
聊聊postgresql的double buffering 问题
26-03-14 - PostgreSQL@K8s 性能优化记
PostgreSQL@K8s 性能优化记
26-03-14
