前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Postgresql FDW技术的应用

Postgresql FDW技术的应用

作者头像
伊泽瑞尔
发布2022-06-01 08:34:24
5380
发布2022-06-01 08:34:24
举报
文章被收录于专栏:大数据与知识图谱

postgres fdw是一种外部访问接口,它可以被用来访问存储在外部的数据,这些数据可以是外部的pg数据库,也可以oracle、mysql等数据库,甚至可以是文件。

测试环境

Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.10)和pg2(192.168.0.11)。

安装postgresql

下面这个源是官网提供的postgressql-9.4的源,ubuntu16.04自带postgresql-9.5的源。

PostgreSQL Apt Repository

创建文件

代码语言:javascript
复制
sudo touch /etc/apt/sources.list.d/pgdg.list

添加一行到文件中

代码语言:javascript
复制
sudo vi !$
代码语言:javascript
复制
deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main

导入存储库签名秘钥,更新包列表

代码语言:javascript
复制
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo apt-key add -

$ sudo apt-get update

这是官网使用的源,但是在apt-get更新时由于网络问题报错,最后选择ubuntu16.04 apt仓库中默认的postgresql9.5。使用下面命令进行安装:

代码语言:javascript
复制
sudo apt-get install postgresql-9.5

2台机器安装步骤一样。

postgresql_fdw测试

主机pg2做远程服务器

在pg2上的postgresql上建库和表:

代码语言:javascript
复制
postgres=# alter user postgres with password '123456';
postgres=# create database foreign_test;
postgres=# \c foreign_test
foreign_test=# create schema schema1;
foreign_test=# \dn
  List of schemas
  Name   |  Owner  
---------+----------
 public  | postgres
 schema1 | postgres
(2 rows)
foreign_test=# create table schema1.t1(id int);
foreign_test=# insert into schema1.t1 values(1);
foreign_test=# select * from schema1.t1;
 id
----
  1
(1 row)

在主机pg1上安装postgresql_fdw扩展

代码语言:javascript
复制
postgres=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION

创建外部服务器,连接一个主机192.168.0.11(pg2)上并且监听5432端口的postgresql的服务器,在该远程服务器上要连接的数据库名为foreign_test:

代码语言:javascript
复制
postgres=# CREATE SERVER foreign_server
postgres-#         FOREIGN DATA WRAPPER postgres_fdw
postgres-#         OPTIONS (host '192.168.0.11', port '5432', dbname 'foreign_test');

定义一个用户映射来标识远程服务器上使用哪个角色:

代码语言:javascript
复制
postgres=# CREATE USER MAPPING FOR postgres
        SERVER foreign_server
        OPTIONS (user 'postgres', password '123456');

创建外部表:

代码语言:javascript
复制
postgres=# CREATE FOREIGN TABLE foreign_table (
                id integer NOT NULL
              )
        SERVER foreign_server
        OPTIONS (schema_name 'schema1', table_name 't1');

FAQ:

postgres=# select * from foreign_table;

ERROR: could not connect to server "foreign_server"

DETAIL: could not connect to server: Connection refused

Is the server running on host "192.168.0.11" and accepting

TCP/IP connections on port 5432?

防火墙已关闭,但是报如上错误。

解决方法:

在192.168.0.11上修改postgresql的允许访问权限

代码语言:javascript
复制
$ vi /etc/postgresql/9.5/main/postgresql.conf
代码语言:javascript
复制
添加:
代码语言:javascript
复制
listen_addresses = '*'

password_encryption = on
代码语言:javascript
复制
$ vi /etc/postgresql/9.5/main/pg_hba.conf

添加:

代码语言:javascript
复制
host all all 0.0.0.0 0.0.0.0 md5

重启服务:

代码语言:javascript
复制
$ /etc/init.d/postgresql restart

然后到192.168.0.10上查询:

代码语言:javascript
复制
postgres=# select * from foreign_table;
 id
----
  1
(1 row)

测试不同postgresql上数据源join操作

在pg2上进入foreign_test数据库:

代码语言:javascript
复制
postgres=# \c foreign_test

展示当前schema:

代码语言:javascript
复制
foreign_test=# show search_path;

切换schema:

代码语言:javascript
复制
foreign_test=# set search_path to schema1;

列出当前schema下的表:

代码语言:javascript
复制
foreign_test=# \d

在当前schema下新建表t2:

代码语言:javascript
复制
foreign_test=# create table t2(id int,name text);

往表t2中插入数据:

代码语言:javascript
复制
foreign_test=# insert into t2 values(1, 'li'),(2, 'zhao'),(3, 'qian'),(4, 'wang'),(5, 'jia');

在pg1上创建外部表:

代码语言:javascript
复制
postgres=# CREATE FOREIGN TABLE foreign_table1 (
                id integer NOT NULL,
                name text
              )
        SERVER foreign_server
        OPTIONS (schema_name 'schema1', table_name 't2');

查看外部表:

代码语言:javascript
复制
postgres=# select * from foreign_table1;
 id | name
----+------
  1 | li
  2 | zhao
  3 | qian
  4 | wang
  5 | jia
(5 rows)

创建本地表:

代码语言:javascript
复制
postgres=# create table local_t1(id int,city text);
postgres=# insert into local_t1 values(1, 'beijing'),(2, 'shanghai'),(5, 'nanjing'),(6, 'lanzhou');
postgres=# select * from local_t1;
 id |   city  
----+----------
  1 | beijing
  2 | shanghai
  5 | nanjing
  6 | lanzhou
(4 rows)

测试远程postgresql和本地postgresql的join操作

代码语言:javascript
复制
postgres=# select * from local_t1 join foreign_table1 on local_t1.id = foreign_table1.id;
 id |   city   | id | name
----+----------+----+------
  1 | beijing  |  1 | li
  2 | shanghai |  2 | zhao
  5 | nanjing  |  5 | jia
(3 rows)
postgres=# select * from local_t1 left join foreign_table1 on local_t1.id = foreign_table1.id;
 id |   city   | id | name
----+----------+----+------
  1 | beijing  |  1 | li
  2 | shanghai |  2 | zhao
  5 | nanjing  |  5 | jia
  6 | lanzhou  |    |
(4 rows)
postgres=# select * from local_t1 right join foreign_table1 on local_t1.id = foreign_table1.id;
 id |   city   | id | name
----+----------+----+------
  1 | beijing  |  1 | li
  2 | shanghai |  2 | zhao
    |          |  3 | qian
    |          |  4 | wang
  5 | nanjing  |  5 | jia
(5 rows)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据与知识图谱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • postgres fdw是一种外部访问接口,它可以被用来访问存储在外部的数据,这些数据可以是外部的pg数据库,也可以oracle、mysql等数据库,甚至可以是文件。
  • 测试环境
  • 安装postgresql
  • postgresql_fdw测试
    • 主机pg2做远程服务器
      • 在主机pg1上安装postgresql_fdw扩展
      • 测试不同postgresql上数据源join操作
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档