fdw是foreign-data wrapper的一个简称,可以叫外部封装数据,之前介绍过file_fdw,dblink。而postgres_fdw实现的是各个postgresql数据库及远程数据库之间的跨库操作,功能和dblink一样。
首先是安装问题,因为这个工具是自带的扩展工具,可以直接到postgres的解压目录下。我测试用的是postgres9.4.4,放在了/tmp下。
所以我的目录是 /tmp/postgresql-9.4.4/contrib。
cd /tmp/postgresql-9.4.4/contrib
make
make install
运行完上面的命令后,可以直接进入数据库,然后使用命令select * from pg_available_extensions;
查看是否安装成功。如果可以看到postgres_fdw,说明已经安装成功。
然后创建该扩展工具:
create extension postgres_fdw;
就可以正常使用了。
查看已经安装并创建的扩展工具:
test=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+-----------------------------------------------------------------
pg_bulkload | 1.0 | public | pg_bulkload is a high speed data loading utility for PostgreSQL
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgres_fdw | 1.0 | public | foreign-data wrapper for remote PostgreSQL servers
select * from pg_foreign_data_wrapper; (这个命令也可以)
postgres_fdw使用很简单,分为四部。
第一步创建远程服务器,这里需要定义主机地址,数据库名和端口。第二步指定连接远程数据库的用户,和创建的远程服务器一起封装。第三步创建远程表,这里也需要把远程表的字段和类型都列一下。第四步和操作本地表一样操作远程表。
下面开始正式测试:
环境: red hat 6.5
数据库:postgres 9.4.4
IP: 192.168.10.8
本次测试使用一台服务器,有两个库test和postgres
在test库中创建外部表,查看postgres中的表tb1(也可以做其他操作)
postgres中:
postgres=# select * from tb1 ;
a
---
1
2
3
7
(4 rows)
test中:
创建远程服务器:
test=# create server server_remote_70 foreign data wrapper postgres_fdw options(host '192.168.10.8',port '5432',dbname 'postgres');
CREATE SERVER
test=# select * from pg_foreign_server ;
srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions
------------------+----------+--------+---------+------------+--------+-----------------------------------------------
server_remote_70 | 10 | 33291 | | | | {host=192.168.10.8,port=5432,dbname=postgres}
(1 row)
指定连接远程数据库的用户和密码:
test=# create user mapping for postgres server server_remote_70 options(user 'postgres',password 'postgres');
CREATE USER MAPPING
test=# select * from pg_user_mappings;
umid | srvid | srvname | umuser | usename | umoptions
-------+-------+------------------+--------+----------+-----------------------------------
33311 | 33310 | server_remote_70 | 10 | postgres | {user=postgres,password=postgres}
(1 row)
创建远程表并查看数据:
test=# CREATE FOREIGN TABLE tbl_fdw(a int) server server_remote_70 options (schema_name 'public',table_name 'tb1');
CREATE FOREIGN TABLE
test=# select * from tbl_fdw ;
a
---
1
2
3
7
(4 rows)
操作远程表:
test=# insert into tbl_fdw values (9);
INSERT 0 1
在postgres查看tb1表。
postgres=# select * from tb1 ;
a
---
1
2
3
7
9
(5 rows)
成功!
最后需要注意的一点是:本次我使用的是同一台服务器上的两套库之间查询。假如使用两台服务器的话,那么需要两台服务器之间的数据库能够互相远程才可以,也就是说需要修改postgres.conf中的listen_addresses = '*' 以及pg_hba.conf中在IPV4下面增加一列:
host all all 0.0.0.0/0 trust
我的这次测试其实可能不需要修改默认的listen_addresses = ‘locahost’,
因为是使用本机连接。
但是我的这次测试还是失败了,原因是我的这台服务器在建库以后修改过IP地址。
所以locahost可能代表的是原来的IP地址(192.168.1.8),而不是修改以后的。
为什么会做出这样的推测,是因为我用修改后的IP 直接进入数据库会报错:
(修改以前的IP地址是192.168.1.8)
[postgres@pg2 data]$ psql -h 192.168.10.8 -U postgres -d postgres
psql: could not connect to server: Connection refused
Is the server running on host "192.168.10.8" and accepting
TCP/IP connections on port 5432?
那么我之前是怎么进入数据库的呢?
直接使用psql 或者psql dbname
————————————————
版权声明:本文为CSDN博主「没有自制力的天蝎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z2916310960/article/details/64922503