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_fdw的更多相关文章

  1. Postgresql_fqw

    Postgresql_fqw 测试环境 Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.34)和pg2(192.168.0.39). 安装postgresql 下面这个 ...

  2. clickhouse 19.14.m.n简单测试

    ClickHouse is a column-oriented database management system (DBMS) for online analytical processing o ...

  3. PG-跨库操作-dblink

    在PostgreSQL数据库之间进行跨库操作的方式 dblink postgres_fdw 本文先说说dblink:dblink是一个支持从数据库会话中连接到其他PostgreSQL数据库的插件.在其 ...

  4. Kingbase_FDW 使用介绍

    与postgresql_fdw功能类似,KINGBASE_FDW  是一种外部访问接口,它可以被用来访问存储在外部的数据.想要使用fdw访问数据需要先确保:网络通,数据库访问配置(pg_hba,con ...

随机推荐

  1. UWP实现时钟

    UWP现在的开发确实很方便,不过资料真的好少啊... 前些天看到同学有实实现自定义的时钟,这东东挺简单的,就自己也写个,没成想,遇到个坑,费了好长时间,记下来一下. 效果图: 画个圆,三条线就好.XA ...

  2. Scintilla开源库使用指南

    http://www.cnblogs.com/superanyi/archive/2011/04/07/2008636.html http://download.csdn.net/detail/den ...

  3. 由Qmake.exe/QtCreator.exe启动速度慢挖进去(非常有趣的调试过程,作者态度不错,而且关闭Welcome插件也是常见办法)

    一直用Qt Creator开发Qt程序,Nokia的Qt Creator实在太慢了,启动慢,编译速度也是超级慢.昨天,终于它慢的让我无法忍受了,我决定抛开手上的一切工作,深入挖掘Qt Creator启 ...

  4. Ansible的安装与使用初探

    一.环境准备 网络配置 管理端:192.168.237.201 受控端:192.168.237.202.192.168.237.203(一共2台) 硬件信息 CPU:1核 内存:512MB 磁盘:10 ...

  5. windows service 之访问权限(有NetworkService和LocalSystem的区分)

    最近写了一个关于从局域网的算机上下载文件的winodws service,最初认为应该没什么大的问题.通过本地的调试也没发现问题.但是当我把程序发布后发现服务报错“访问路径被拒绝”,我的第一感觉,肯定 ...

  6. 界面美化.CStatic控件的美化(好多系列文章)

    http://www.cnblogs.com/20090802/archive/2010/09/17/1829283.html 静态控件也是比较常用的控件,在VS开发环境中用的应该挺频繁的吧. 其实m ...

  7. Qt官方开发环境生成的exe发布方式--使用windeployqt

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  8. OpenCv的python环境搭建

    1.python的安装参看 http://www.cnblogs.com/samo/p/6734403.html 2.OpenCv安装.opencv2.4.10可以支持vc10/vc11/vc12,o ...

  9. sublime3使用笔记

    1.ctrl+n 新建一个文件: 2.alt+shift+数字 分屏显示: 3.ctrl+alt+down(向下键) 连选很多行的指定开始位置: 如图: 紧接着再按shift+right(选中需要更改 ...

  10. Anaconada安装

    目录 Anaconda介绍 Anaconda下载 安装Anaconda 配置环境变量 管理虚拟环境 activate 切换环境 卸载环境 关于环境总结 安装第三方包 卸载第三方包 查看环境包信息 导入 ...