PostgesSQL外部数据封装FDW

news2025/4/25 20:42:14

PostgesSQL外部数据封装FDW

  • 1. FDW外部数据配置(单表)
    • 1.1 远端数据库创建测试表
    • 1.2 安装扩展postges\_fdw
    • 1.3 创建外部服务SERVER
    • 1.4 创建用户映射USER MAPPING
    • 1.5 创建远程表FOREIGN TABLE
    • 1.6 数据库更新测试
  • 2. FDW外部数据配置(用户)
    • 2.1 远端数据库创建测试表
    • 2.2 创建远程schema
    • 2.3 导入远程schema
    • 2.4 查看远程schema表
  • 3. FDW运维操作
    • 3.1 外部表设置只读操作
    • 3.2 删除增加外部表列
    • 3.3 模式导入部分表

POSTGRESQL FDW 的名词是 foreign-data wrapper 外部数据包装, 此模块提供的功能与较旧的 dblink 模块的功能有很大重叠。但是 postgres_fdw 提供了更透明且符合标准的语法来访问远程表,并且在许多情况下可以提供更好的性能。

要准备使用 postgres_fdw 进行远程访问

  1. 使用 CREATE EXTENSION 安装 postgres_fdw 扩展。

  2. 使用 CREATE SERVER 创建外部服务器对象,以表示您要连接的每个远程数据库。将连接信息指定为服务器对象的选项,但 userpassword 除外。

  3. 使用 CREATE USER MAPPING 为您要允许访问每个外部服务器的每个数据库用户创建用户映射。将要使用的远程用户名和密码指定为用户映射的 userpassword 选项。

  4. 使用 CREATE FOREIGN TABLE 或 IMPORT FOREIGN SCHEMA 为您要访问的每个远程表创建外部表。外部表的列必须与引用的远程表匹配。但是,如果将正确的远程名称指定为外部表对象的选项,则可以使用与远程表不同的表和/或列名。

1. FDW外部数据配置(单表)

1.1 远端数据库创建测试表

postgres=# create database testdb13;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 testdb13  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(4 rows)
postgres=# create user u13 with password 'u13';
CREATE ROLE
postgres=# \c testdb13 u13
Password for user u13: 
You are now connected to database "testdb13" as user "u13".
testdb13=> 
testdb13=> create table t1 (id int,name varchar);
CREATE TABLE
testdb13=> insert into t1 values(1,'A');
INSERT 0 1
testdb13=> select * from t1;
 id | name 
----+------
  1 | A
(1 row)
testdb13=> \dt+
                         List of relations
 Schema | Name | Type  | Owner | Persistence | Size  | Description 
--------+------+-------+-------+-------------+-------+-------------
 public | t1   | table | u13   | permanent   | 16 kB | 

1.2 安装扩展postges_fdw

已安装扩展

postgres=# \dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

安装报错,需先在本地软件安装

postgres=# create extension postges_fdw;
ERROR:  extension "postges_fdw" is not available
DETAIL:  Could not open extension control file "/pgsql/app/pg16/share/extension/postges_fdw.control": No such file or directory.
HINT:  The extension must first be installed on the system where PostgreSQL is running.

进入到编译安装目录,编辑安装postgres_fdw

[root@pgdb ~]# cd /pgsql/soft/postgresql-16.1/contrib/postgres_fdw
[root@pgdb postgres_fdw]# ls
connection.c  deparse.c  expected  meson.build  option.o                    postgres_fdw--1.0.sql  postgres_fdw.control  postgres_fdw.o   shippable.c  sql
connection.o  deparse.o  Makefile  option.c     postgres_fdw--1.0--1.1.sql  postgres_fdw.c         postgres_fdw.h        postgres_fdw.so  shippable.o
[root@pgdb postgres_fdw]# make
[root@pgdb postgres_fdw]# make install

安装扩展postgres_fdw

postgres=# create extension postgres_fdw ;
CREATE EXTENSION
postgres=# \dx
                               List of installed extensions
     Name     | Version |   Schema   |                    Description                     
--------------+---------+------------+----------------------------------------------------
 plpgsql      | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgres_fdw | 1.1     | public     | foreign-data wrapper for remote PostgreSQL servers
(2 rows)

1.3 创建外部服务SERVER

创建一个服务器名pg_fdw_server 使用的类型为postgres_fdw 连接的数据库为 dbname 为 testdb13

postgres=# CREATE SERVER pg_fdw_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.100', port '5432', dbname 'testdb13');
CREATE SERVER

查看创建server

postgres=# \des
             List of foreign servers
     Name      |  Owner   | Foreign-data wrapper 
---------------+----------+----------------------
 pg_fdw_server | postgres | postgres_fdw
(1 row)
postgres=# \des+
                                                                   List of foreign servers
     Name      |  Owner   | Foreign-data wrapper | Access privileges | Type | Version |                      FDW options                       | Description 
---------------+----------+----------------------+-------------------+------+---------+--------------------------------------------------------+-------------
 pg_fdw_server | postgres | postgres_fdw         |                   |      |         | (host '192.168.1.100', port '5432', dbname 'testdb13') | 
(1 row)

1.4 创建用户映射USER MAPPING


postgres=# CREATE USER MAPPING FOR postgres SERVER pg_fdw_server OPTIONS (user 'u13', password 'u13');
CREATE USER MAPPING
postgres=# \deu+
                   List of user mappings
    Server     | User name |          FDW options           
---------------+-----------+--------------------------------
 pg_fdw_server | u109      | ("user" 'u13', password 'u13')
(1 row)

1.5 创建远程表FOREIGN TABLE

postgres=# CREATE FOREIGN TABLE fdw_t1(id int,name varchar) SERVER pg_fdw_server OPTIONS (schema_name 'public',table_name 't1');
CREATE FOREIGN TABLE
postgres=# \det+
                                 List of foreign tables
 Schema | Table  |    Server     |               FDW options               | Description 
--------+--------+---------------+-----------------------------------------+-------------
 public | fdw_t1 | pg_fdw_server | (schema_name 'public', table_name 't1') | 
 postgres=# select * from fdw_t1;
 id | name 
----+------
  1 | A
(1 row)

1.6 数据库更新测试

远端数据库insert数据

postgres=# \c testdb13 u13
Password for user u13: 
You are now connected to database "testdb13" as user "u13".
testdb13=> insert into t1 values(2,'B');
INSERT 0 1

本地数据库访问远程表,实时同步过来。

postgres=# select * from fdw_t1;
 id | name 
----+------
  1 | A
  2 | B
(2 rows)

2. FDW外部数据配置(用户)

2.1 远端数据库创建测试表

testdb13=> create table t2 (id int,name varchar);
CREATE TABLE
testdb13=>  create table t3 (id int,name varchar);
CREATE TABLE
testdb13=> \dt+
                           List of relations
 Schema | Name | Type  | Owner | Persistence |    Size    | Description 
--------+------+-------+-------+-------------+------------+-------------
 public | t1   | table | u13   | permanent   | 16 kB      | 
 public | t2   | table | u13   | permanent   | 8192 bytes | 
 public | t3   | table | u13   | permanent   | 8192 bytes | 
(3 rows)

2.2 创建远程schema

postgres=# create schema remote_fdw_schema;
CREATE SCHEMA

2.3 导入远程schema

postgres=# import foreign schema public from server pg_fdw_server into remote_fdw_schema options ( import_default 'true');
IMPORT FOREIGN SCHEMA

2.4 查看远程schema表

postgres=# \det+ remote_fdw_schema.*
                                      List of foreign tables
      Schema       | Table |    Server     |               FDW options               | Description 
-------------------+-------+---------------+-----------------------------------------+-------------
 remote_fdw_schema | t1    | pg_fdw_server | (schema_name 'public', table_name 't1') | 
 remote_fdw_schema | t2    | pg_fdw_server | (schema_name 'public', table_name 't2') | 
 remote_fdw_schema | t3    | pg_fdw_server | (schema_name 'public', table_name 't3') | 
(3 rows)
postgres=# select * from remote_fdw_schema.t2;
 id | name 
----+------
(0 rows)

postgres=# select * from remote_fdw_schema.t1;
 id | name 
----+------
  1 | A
  2 | B
(2 rows)

postgres=# select * from remote_fdw_schema.t3;
 id | name 
----+------
(0 rows)

远端数据库更新数据测试

postgres=# \c testdb13 u13
testdb13=> insert into t2 values(22,'BB');
INSERT 0 1
testdb13=> insert into t3 values(33,'CC');
INSERT 0 1

本地数据库查看远程schema表

postgres=# select * from remote_fdw_schema.t2;
 id | name 
----+------
 22 | BB
(1 row)
postgres=# select * from remote_fdw_schema.t3;
 id | name 
----+------
 33 | CC
(1 row)

3. FDW运维操作

3.1 外部表设置只读操作

postgres=# insert into remote_fdw_schema.t1 values (3,'C');
INSERT 0 1
postgres=# select * from remote_fdw_schema.t1;
 id | name 
----+------
  1 | A
  2 | B
  3 | C
(3 rows)

修改为只读操作,false改为true读写模式

postgres=# alter foreign table remote_fdw_schema.t1 options (add updatable 'false');
ALTER FOREIGN TABLE
postgres=# insert into remote_fdw_schema.t1 values (4,'D');
ERROR:  foreign table "t1" does not allow inserts

3.2 删除增加外部表列

删除列

postgres=# select * from remote_fdw_schema.t1;
 id | name 
----+------
  1 | A
  2 | B
  3 | C
(3 rows)
postgres=# alter foreign table remote_fdw_schema.t1 drop column name;
ALTER FOREIGN TABLE
postgres=# select * from remote_fdw_schema.t1;
 id 
----
  1
  2
  3
(3 rows)

增加列

postgres=# alter foreign table remote_fdw_schema.t1 add column name varchar;
ALTER FOREIGN TABLE
postgres=# select * from remote_fdw_schema.t1;
 id | name 
----+------
  1 | A
  2 | B
  3 | C
(3 rows)

3.3 模式导入部分表

  • Limit to 指定哪些表导入
postgres=# \det_ remote_fdw_schema.*
 List of foreign tables
 Schema | Table | Server 
--------+-------+--------
(0 rows)
postgres=# import foreign schema public limit to ( t1,t2) from server pg_fdw_server into remote_fdw_schema options ( import_default 'true');
IMPORT FOREIGN SCHEMA
postgres=# \det_ remote_fdw_schema.*
          List of foreign tables
      Schema       | Table |    Server     
-------------------+-------+---------------
 remote_fdw_schema | t1    | pg_fdw_server
 remote_fdw_schema | t2    | pg_fdw_server
(2 rows)
  • Except 指定哪些表不要导入
postgres=# \det_ remote_fdw_schema.*
 List of foreign tables
 Schema | Table | Server 
--------+-------+--------
(0 rows)
postgres=# import foreign schema public except ( t1,t3) from server pg_fdw_server into remote_fdw_schema options ( import_default 'true');
IMPORT FOREIGN SCHEMA
postgres=# \det_ remote_fdw_schema.*
          List of foreign tables
      Schema       | Table |    Server     
-------------------+-------+---------------
 remote_fdw_schema | t2    | pg_fdw_server
(1 row)

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

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

相关文章

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域,高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…

[Java · 铢积寸累] 数据结构 — 数组类型 - 增 删 改 查

🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java 学习手册 在上一章中我们介绍了如何声明与创建数组,还介绍了数组的基本使用方式。本章我们将在上一章的基础上,拓展数组的使用方式(可能会涉及一些思…

前端笔记-Axios

Axios学习目标 Axios与API交互1、Axios配置与使用2、请求/响应拦截器3、API设计模式(了解RESTful风格即可) 学习参考:起步 | Axios中文文档 | Axios中文网 什么是Axios Axios 是一个基于 Promise 的现代化 HTTP 客户端库,专…

C# 类型、存储和变量(值类型引用类型)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 值类型引用类型 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象…

智慧校园从配电开始:AISD300为校园安全加上智能防护罩

安科瑞刘鸿鹏 摘要 随着校园用电需求不断上升及其安全保障要求的提高,传统低压配电系统已逐渐难以满足现代校园的安全与智能化管理需求。本文基于安科瑞电气推出的AISD300系列三相智能安全配电装置,探讨其在校园电力系统中的应用优势及关键技术特性。…

一 、环境的安装 Anaconda + Pycharm + PaddlePaddle

《从零到一实践:系统性学习生成式 AI(NLP)》 一 、环境的安装 Anaconda Pycharm PaddlePaddle 1. Anaconda 软件安装 Anaconda 软件安装有大量的教程,此处不在说明,安装完成之后界面如下: 2. 创建 Anaconda 虚拟环境 Paddl…

十倍开发效率 - IDEA插件之 Maven Helper

0X00 先看效果 第一个选项表示存在冲突的依赖,可以看到图片中 mysql 的连接依赖发生了冲突,在低版本的上面直接右键选择 Exclude,冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper,选择第一个进行安装&am…

人机共跑,马拉松人型机器人同跑

马拉松比赛对人形机器人来说,是一场对硬件极限的测试,涉及机械、传感器、能源管理等多个方面。用户问的是硬件方面的考察和改进,这意味着我的回答需要聚焦于硬件性能,而不是算法或软件的优化。 对人形机器人硬件的考研 机械结构与…

策略模式:动态切换算法的设计智慧

策略模式:动态切换算法的设计智慧 一、模式核心:定义一系列算法并可相互替换 在软件开发中,常常会遇到需要根据不同情况选择不同算法的场景。例如,在电商系统中,根据不同的促销活动(如满减、折扣、赠品&a…

uniapp微信小程序:WIFI设备配网之TCP/UDP开发AP配网

一、AP配网技术原理 1.1 配网模式选择 AP配网(SoftAP模式)是IoT设备配网成功率最高的方案之一 1、其核心原理: ​​设备端​​:启动AP模式(如SSID格式YC3000_XXXX,默认IP192.168.4.1)​​手…

离线-DataX

基本介绍 DataX 是阿里云 DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台,它是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源…

第5课:对象与类——JS的“信息收纳盒”

生活从不会亏待每一个努力向上的人,愿你带着满腔热忱,无畏前行,用汗水书写青春的华章,用拼搏铸就人生的辉煌,今日的每一份付出,都将是未来成功的基石! 欢迎来到「JavaScript 魔法学院」第 5 课…

xshell 登录验证失败解决

产生原因:检查防火墙、selinux 、网络模式、对外是否能ping外网 systemctl status firewalld cat /etc/selinux/config #disabled ping 223.5.5.5 ping 8.8.8.8 ping www.baidu.com 一、检查网络连接 确认虚拟机是否在线: 首先,确保虚…

AI 赋能 3D 创作!Tripo3D 全功能深度解析与实操教程

大家好,欢迎来到本期科技工具分享! 今天要给大家带来一款革命性的 AI 3D 模型生成平台 ——Tripo3D。 无论你是游戏开发者、设计师,还是 3D 建模爱好者,只要想降低创作门槛、提升效率,这款工具都值得深入了解。 接下…

AI书籍大模型微调-基于亮数据获取垂直数据集

大模型的开源,使得每位小伙伴都能获得AI的加持,包括你可以通过AIGC完成工作总结,图片生成等。这种加持是通用性的,并不会对个人的工作带来定制的影响,因此各个行业都出现了垂直领域大模型。 垂直大模型是如何训练出来…

Kafka命令行的使用/Spark-Streaming核心编程(二)

Kafka命令行的使用 创建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分区数量,副本数量,都是必须的。 数据的形式: 主题名称-分区编号。 在…

2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)

机器学习入门 前言 说实话,机器学习想学好真心不易,很多时候都感觉自己学得云里雾里。以前一段时间自己为了完成毕业设计,在机器学习的理论部分并没有深究,仅仅通过TensorFlow框架力求快速实现模型。现在来看,很多时候…

SQL 时间转换的CONVERT()函数应用说明

目录 1.常用查询使用的几个 2.其他总结 1.常用查询使用的几个 SELECT CONVERT(VARCHAR, GETDATE(), 112) SELECT CONVERT(VARCHAR, GETDATE(), 113)SELECT CONVERT(VARCHAR, GETDATE()-1, 112) SELECT CONVERT(VARCHAR, GETDATE()-1, 113) 2.其他总结 SELECT CONVERT(VARCHA…

SystemWeaver详解:从入门到精通的深度实战指南

SystemWeaver详解:从入门到精通的深度实战指南 文章目录 SystemWeaver详解:从入门到精通的深度实战指南一、SystemWeaver环境搭建与基础配置1.1 多平台安装全流程 二、新手必学的十大核心操作2.1 项目创建全流程2.2 建模工具箱深度解析 三、需求工程与系…

windows中kafka4.0集群搭建

参考文献 Apache Kafka windows启动kafka4.0(不再需要zookeeper)_kafka压缩包-CSDN博客 Kafka 4.0 KRaft集群部署_kafka4.0集群部署-CSDN博客 正文 注意jdk需要17版本以上的 修改D:\software\kafka_2.13-4.0.0\node1\config\server.properties配置文…