Postgresql_fdw

测试环境

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

安装postgresql

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

PostgreSQL Apt Repository

创建文件

$ sudo touch /etc/apt/sources.list.d/pgdg.list

添加一行到文件中

$ sudo vi !$
deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main

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

$ 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。使用下面命令进行安装:

$ sudo apt-get install postgresql-9.5

2台机器安装步骤一样。

postgresql_fdw测试

主机pg2做远程服务器

在pg2上的postgresql上建库和表:

postgres=# alter user postgres with password '';
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扩展

postgres=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION

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

postgres=# CREATE SERVER foreign_server
postgres-# FOREIGN DATA WRAPPER postgres_fdw
postgres-# OPTIONS (host '192.168.0.39', port '', dbname 'foreign_test');

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

postgres=# CREATE USER MAPPING FOR postgres
SERVER foreign_server
OPTIONS (user 'postgres', password '');

创建外部表:

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.39" and accepting

TCP/IP connections on port 5432?

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

解决方法:

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

$ vi /etc/postgresql/9.5/main/postgresql.conf  
添加:
listen_addresses = '*'

password_encryption = on
$ vi /etc/postgresql/9.5/main/pg_hba.conf

添加:

host all all 0.0.0.0 0.0.0.0 md5

重启服务:

$ /etc/init.d/postgresql restart

然后到192.168.0.34上查询:

postgres=# select * from foreign_table;
id
----
1
(1 row)

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

在pg2上进入foreign_test数据库:

postgres=# \c foreign_test

展示当前schema:

foreign_test=# show search_path;

切换schema:

foreign_test=# set search_path to schema1;

列出当前schema下的表:

foreign_test=# \d

在当前schema下新建表t2:

foreign_test=# create table t2(id int,name text);

往表t2中插入数据:

foreign_test=# insert into t2 values(1, 'li'),(2, 'zhao'),(3, 'qian'),(4, 'wang'),(5, 'jia');

在pg1上创建外部表:

postgres=# CREATE FOREIGN TABLE foreign_table1 (
id integer NOT NULL,
name text
)
SERVER foreign_server
OPTIONS (schema_name 'schema1', table_name 't2');

查看外部表:

postgres=# select * from foreign_table1;
id | name
----+------
1 | li
2 | zhao
3 | qian
4 | wang
5 | jia
(5 rows)

创建本地表:

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操作

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)

参考网址:http://www.postgres.cn/docs/9.6/postgres-fdw.html

欢迎加入大数据与AI交流QQ群一起学习:572703882

Postgresql_fqw的更多相关文章

随机推荐

  1. 前端教你学UI——人物处理(一)

    一.序言 本文作为本系列的第一篇写UI的文章,开头还是有必要申明一些东西的,本系列主要是为了作为博主在前端工作之余学习UI的一个记录,同时为了让更多的同行学习到一些编程之外的其他东西.所以本文会尽可能 ...

  2. Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!

    1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...

  3. Linux OS共享文件

    背景: 相较于windows.unix等OS,Linux因为其开源.安全.稳定.性能优越等优点,已越来越受到互联网的青睐.而我们在学习和使用Linux也就会考虑到Linux机器和我们日常用的windo ...

  4. Eclipse中常用的快捷键,敏捷开发必备.

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...

  5. socket获取百度页面

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

  6. maven 修改默认的JDK版本

    maven jdk 版本配置 maven 默认使用的 jdk 版本 新建一个 maven 项目,如下 : 项目左下方出现一个感叹号,JRE 显示的是 1.5 版本.解决方式有两种,一种是配置 pom. ...

  7. 新手如何快速入门Python

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层.虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如 ...

  8. Spring 4学习——问题与注意事项(一)

    1.Spring项目依赖的jar包有5个: 2.applicationContext.xml文件中,如下bean的property的name值对应的是HelloWorld类中的setter方法,即na ...

  9. NodeMCU入门(4):搭建Web服务器,配置网络连接

    准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...

  10. 不完全翻译:Threading in C#-Getting Started

    Introduction(引入,介绍) and Concepts(概念) 原文地址:http://www.albahari.com/threading/ 注:水平有限不能全文翻译,备注了个别字段和短句 ...