PostgreSQL的postgres_fdw跨库使用

PostgreSQL的postgres_fdw跨库使用

PostgreSQL的数据库逻辑上是相互独立的,和Oracle类似,如果要访问其他数据库,需要做跨库操作,Postgres本身提供了一些扩展,比如dblink,pgsql_fdw等,高版本的建议使用postgres_fdw,也就是pgsql_fdw的升级版。

一、环境介绍

fdw是foreign-data wrapper的一个简称,可以叫外部封装数据,之前介绍过file_fdw,dblink http://my.oschina.net/Kenyon/blog/55294

http://my.oschina.net/Kenyon/blog/165432

而postgres_fdw实现的是各个postgresql数据库及远程数据库之间的跨库操作,功能和dblink一样。

本地 10.1.11.72 DB_port 5432

远程 10.1.11.71 DB_port 5432

71远端数据准备

postgres=# show search_path;
 search_path 
-------------
 schema_fdw
(1 row)
postgres=# create table tbl_kenyon (id int,remark text);
CREATE TABLE
postgres=# insert into tbl_kenyon select generate_series(1,100),'Kenyon Go!';
INSERT 0 100

二、安装使用

 安装分4步走


1.本地安装extension

安装的扩展名是来自于share/extension/*.control中的文件名*,比如postgres_fdw.control

postgres=# create extension postgres_fdw;
CREATE EXTENSION
postgres=# select * from pg_extension ;
 extname     | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition   -------------------+----------+--------------+----------------+------------+-----------+
 plpgsql            |       10 |           11 | f              | 1.0        |           | 
 pg_stat_statements |       10 |         2200 | t              | 1.1        |           | 
 postgres_fdw       |       10 |         2200 | t              | 1.0        |           | 
(3 rows)
postgres=# select * from pg_foreign_data_wrapper;
  fdwname    | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions 
  ------------+----------+------------+--------------+--------+------------
 postgres_fdw |       10 |     154356 |       154357 |        | 
(1 row)

或
postgres=# \dx
                                     List of installed extensions
      Name        | Version |  Schema |                        Description                     -----------------+---------+------------+-----------------------------------------------------
 pg_stat_statements | 1.1     | public |track execution statistics of all SQL statements executed
 plpgsql            | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgres_fdw       | 1.0     | public     | foreign-data wrapper for remote PostgreSQL servers
(3 rows)

2.本地创建server并查看

该server作用是在本地配置一个连接远程的信息,下面的配置是要连接到远程DB名称是postgres数据库

postgres=# create server server_remote_71 foreign data wrapper postgres_fdw options(host '10.1.11.71',port '5432',dbname 'postgres');
CREATE SERVER
postgres=# select * from pg_foreign_server ;
     srvname      | srvowner | srvfdw | srvtype | srvversion | srvacl |   srvoptions  
--------------+----------+--------+---------+------------+--------+--------------------------
server_remote_71 |       10 | 154358 |         |     |{host=10.1.11.71,port=5432,dbname=postgres}
(1 row)
或者
postgres=# \des
              List of foreign servers
       Name       |  Owner   | Foreign-data wrapper 
------------------+----------+----------------------
 server_remote_71 | postgres | postgres_fdw
(1 row)

3.创建用户匹配信息并查看

--for后面的postgres是本地登录执行的用户名,option里存储的是远程的用户密码
postgres=# create user mapping for usr_pg_fdw server server_remote_71 options(user 'usr_pg_fdw',password '123456');
CREATE USER MAPPING
postgres=# select * from pg_user_mappings;
  umid  | srvid  |     srvname      | umuser | usename  |             umoptions             
--------+--------+------------------+--------+----------+-----------------------------------
 154360 | 154359 | server_remote_71 |     10 | postgres | {user=usr_pg_fdw,password=123456}
(1 row)
或
postgres=# \deu+
                          List of user mappings
      Server      | User name |               FDW Options                
------------------+-----------+------------------------------------------
 server_remote_71 | postgres  | ("user" 'usr_pg_fdw', password '123456')
(1 row)

4.本地创建外部表,指定server

postgres=# CREATE FOREIGN TABLE tbl_kenyon(id int,remark text) server server_remote_71 options (schema_name 'schema_fdw',table_name 'tbl_test');
CREATE FOREIGN TABLE

--如果不指定options,数据库会自动匹配相同的表名和表结构,如果有一项不匹配就会报错表或字段不对应的错误
--options可以指定对应的schema和表名等

5.配置pg_hba.conf

此处主要是在远端配置本地能访问的策略,略

6.本地访问远端,支持远程select和DML,和本地表操作一样

postgres=# select * from tbl_kenyon limit 10;
 id |   remark   
----+------------
  1 | Kenyon Go!
  2 | Kenyon Go!
  3 | Kenyon Go!
  4 | Kenyon Go!
  5 | Kenyon Go!
  6 | Kenyon Go!
  7 | Kenyon Go!
  8 | Kenyon Go!
  9 | Kenyon Go!
 10 | Kenyon Go!
(10 rows)

--本地更新远程数据
postgres=# delete from tbl_kenyon where id < 10;
DELETE 9
postgres=# select * from tbl_kenyon limit 10;
 id |   remark   
----+------------
 10 | Kenyon Go!
 11 | Kenyon Go!
 12 | Kenyon Go!
 13 | Kenyon Go!
 14 | Kenyon Go!
 15 | Kenyon Go!
 16 | Kenyon Go!
 17 | Kenyon Go!
 18 | Kenyon Go!
 19 | Kenyon Go!
(10 rows)

三、相关系统表

select * from pg_extension;
select * from pg_foreign_data_wrapper;
select * from pg_foreign_server;
select * from pg_foreign_table;

四、清理扩展

postgres=# drop foreign table tbl_kenyon;
DROP FOREIGN TABLE
postgres=# drop user mapping for postgres server server_remote_71 ;
DROP USER MAPPING
postgres=# drop server server_remote_71 ;
DROP SERVER
postgres=# drop extension postgres_fdw ;
DROP EXTENSION

五、相关问题

1.ERROR:  user mapping not found for "postgres"
检查一下user mapping用户信息,执行用户需要与user mapping的第一个用户相匹配

2.pg_fdw=> select * from tbl_kenyon limit 2;
ERROR:  could not connect to server "pg_remote_71"
DETAIL:  FATAL:  password authentication failed for user "usr_pg_fdw" 
检查一下options里面的用户密码与远程用户密码是否匹配

六、总结

1.postgres_fdw和dblink实现的功能是一样的,但是配置使用postgres_fdw更简单,而且也支持远程更新,稳定性和方便性考虑更推荐postgres_fdw,较像一个可以更新远程数据库的视图

2.在数据迁移或者ETL及定时刷新上面会比较有用处

3.外部表实际不占存储空间

4.物理表和外部表不能同名,因为pg_class的对象名称唯一键的缘故

5.远程改掉用户密码对当前本地连接无效,但本地再次连接取数会报错

转载于:https://my.oschina.net/Kenyon/blog/214953

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109866.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月28日 下午10:00
下一篇 2021年8月28日 下午11:00


相关推荐

  • 后缀表达式、前缀表达式

    后缀表达式、前缀表达式后缀表达式和前缀表达式是什么呢 nbsp nbsp nbsp nbsp nbsp 前缀表达式 不包括括号的算术表达式 将运算符写在前面 操作数写在后面的表达式 为纪念其发明者波兰数学家 JanLukasiewc 也称 波兰式 nbsp nbsp nbsp nbsp nbsp 后缀表达式 不包括括号 运算符放在两个运算对象的后面 所有的计算按运算符出现的顺序 严格从左向右进行 也称 逆波兰式 nbsp nbsp nbsp nbsp nbsp 举个栗子 nbsp nbsp nbsp nbsp nbsp nbsp

    2026年3月19日
    2
  • ioctl函数详解(Linux内核 )

    ioctl函数详解(Linux内核 )1.概念ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命令的方式实现。在文件I/O中,ioctl扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析ioctl函数。2.用户空间ioctl#include<sys/ioctl.h>intioctl(intfd,intcmd,…);参数描述

    2022年10月17日
    4
  • 腾讯课堂下载回放视频课程记录_腾讯课堂回放下载

    腾讯课堂下载回放视频课程记录_腾讯课堂回放下载腾讯课堂下载回放视频对于爱学习的童鞋来说,能把腾讯课堂上的视频下载下来,随时随地听课,那该有多好啊!但是,腾讯课堂采取了多种加密措施,导致下载视频难上加难……要想下载视频,必须分为两部分进行,先获取视频的m3u8地址,然后用m3u8地址下载视频。第一步,获取视频m3u8地址:下面用两款热门浏览器:360安全浏览器和谷歌浏览器进行演示。①360浏览器:…

    2025年7月24日
    5
  • Java定时器(Timer)「建议收藏」

    Java定时器(Timer)「建议收藏」1.介绍Timer和TimerTask是用于在后台线程中调度任务的javautil类。简单地说,TimerTask是要执行的任务,Timer是调度器。2.调度一次性任务2.1指定延迟后执行让我们从简单地在定时器的帮助下运行单个任务开始:@TestpublicvoidgivenUsingTimer_whenSchedulingTaskOnce_thenCorrect(){TimerTasktask=newTimerTask(){publicvoid

    2022年7月7日
    26
  • SQL注入原理及PreparedStatement的使用

    SQL注入原理及PreparedStatement的使用

    2021年8月8日
    62
  • 机器学习之特征归一化

    当数据集的数值属性具有非常大的比例差异,往往导致机器学习的算法表现不佳,当然也有极少数特例。在实际应用中,通过梯度下降法求解的模型通常需要归一化,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但

    2021年12月30日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号