FDW是外部数据包装器,基于PG有这个功能,如果想要数据融合,很容易在PG上实现,只要开发对应的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…


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

file_fdw插件为PG数据库提供了访问外部数据的能力,比如我们常见的文件csv,log等,该插件是内置在PG源码的contrib中。
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;

--先生成一个file_fdw服务器。 CREATE SERVER file_fdw_server FOREIGN DATA WRAPPER file_fdw;
-- 创建一个名为"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;

通过 postgres_fdw访问远程PostgreSQL数据库表。
步骤如下: 在源端(本地库)创建 postgres_fdw 插件 创建 foreign server 外部服务(即:指连接外部数据源的连接信息) 创建映射用户(映射用户指定了访问外部表的本地用户和远程用户信息) 创建外部表(外部表的表定义建议和远端表结构一致)
本地库做如下的操作: --编译安装 [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

本地库做如下的操作: 若使用超级用户使用postgres_fdw可以跳过 普通用户使用postgres_fdw需要单独授权 GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO pgtest;
本地库做如下的操作: 外部服务定义了远端PostgreSQL数据库的IP、端口、数据库连接信息 CREATE SERVER fdwpg2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'pg2host', port '5432', dbname 'devdb');
本地库做如下的操作: 映射用户指定了连接源端 PostgreSQL 数据库的用户名和密码信息 CREATE USER MAPPING FOR pgtest SERVER fdwpg2 OPTIONS (user 'pg2user', password 'pg2user'); FOR:配置的用户为本地的数据库用户 OPTIONS :配置的是远端PostgreSQL数据库的用户和密码
--远端数据库创建测试表 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;
支持可写特性 从PostgreSQL 9.3 版本开始支持postgres_fdw 外部表可写的条件 创建映射用户时配置的远端数据库用户需要对远端表具有写权限 PostgreSQL 必须是 9.3及以上版本。 聚合函数下推 PostgreSQL 10 版本在 postgres_fdw 扩展模块中新增了一个可以将聚合、 关联操作下推到远端 PostgreSQL 数据库进行的特性。 它大幅度减少了从远程库传送到本地库的数据量, 提升了 postgres_fdw 外部表上聚合查询的性能。
FDW的其它插件支持外部表方式访问mysql,oracle等数据库表数据,PG的FDW可以根据业务开发各种FDW把数据进行融合,比如数据迁移、异构DBMS之间的联动,是一个做数据整个的非常棒的功能
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69947868/viewspace-3011319/ ,如需转载,请注明出处,否则将追究法律责任。