头图

通过使用file_fdw扩展使得PostgreSQL能够访问外部文件系统中的数据文件,同样通过使用postgres_fdw扩展可以使得PostgreSQL能够访问外部远端的PostgreSQL数据库中的数据。视频讲解如下:
https://www.bilibili.com/video/BV1si1hYUEmH/?aid=113377070290...

下面通过具体的步骤操作来演示如何使用postgres_fdw扩展。
(1)进入PostgreSQL源码目录下的contrib/postgres_fdw目录,编译并安装postgres扩展。

cd postgresql-15.3/contrib/postgres_fdw/
make
make install

# 编译完成后,会在当前目录下生成postgres_fdw.so文件。

(2)修改postgresql.conf文件中的shared_preload_libraries参数。

shared_preload_libraries = 'file_fdw,postgres_fdw'

(3)重新启动PostgreSQL数据库实例。

bin/pg_ctl -D data/ -l logfile restart

(4)创建postgres_fdw扩展。

postgres=# create extension postgres_fdw ;

(5)查看PostgreSQL数据库中已安装的扩展。

postgres=# select * from pg_extension;

# 输出信息如下:
-[ RECORD 1 ]--+-------------
oid            | 13566
extname        | plpgsql
extowner       | 10
extnamespace   | 11
extrelocatable | f
extversion     | 1.0
extconfig      | 
extcondition   | 
-[ RECORD 2 ]--+-------------
oid            | 16628
extname        | file_fdw
extowner       | 10
extnamespace   | 2200
extrelocatable | t
extversion     | 1.0
extconfig      | 
extcondition   | 
-[ RECORD 3 ]--+-------------
oid            | 16648
extname        | postgres_fdw
extowner       | 10
extnamespace   | 2200
extrelocatable | t
extversion     | 1.0
extconfig      | 
extcondition   | 

(6)基于postgres_fdw创建外部PostgreSQL数据库服务器对象foreign_server。

postgres=# create server foreign_server
    foreign data wrapper postgres_fdw
    options (host '192.168.79.178', port '5432', dbname 'scott');

# 这里的foreign_server是指定的外部服务器名称;
# host参数是远程服务器的地址,示例中为192.168.79.178;
# port 参数是远程服务器的端口,示例中为5432;
# dbname 参数是远程数据库的名称,示例中为scott。

(7)查看当前数据库中移创建的外部服务。

postgres=# \des

# 输出的信息如下:
List of foreign servers
-[ RECORD 1 ]--------+---------------
Name                 | foreign_server
Owner                | postgres
Foreign-data wrapper | postgres_fdw
-[ RECORD 2 ]--------+---------------
Name                 | service_file
Owner                | postgres
Foreign-data wrapper | file_fdw

(8)创建用户映射。

postgres=# create user mapping for postgres
    server foreign_server 
    options (user 'postgres', password 'Welcome_1');

# 该语句为本地postgres用户创建了一个
# 访问远程服务器foreign_server时的用户映射,
# 也就是使用用户名postgres和密码Welcome_1连接远程服务器。

(9)创建外部表。

postgres=# create foreign table ft_dept
    (deptno int,
    dname varchar(10),
    loc varchar(10))
    server foreign_server
    options (schema_name 'public', table_name 'dept');

(10)现在可以在本地数据库中通过外部表访问对应的远程表。

postgres=# select * from ft_dept;

# 输出的信息如下:
 deptno |   dname    |   loc    
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
     40 | OPERATIONS | BOSTON
(4 rows)

注意:为了能够在本地访问远端的PostgreSQL数据库服务器,需要修改远端PostgreSQL数据库服务器的postgresql.conf和pg_hba.conf配置文件,以允许远程登录访问。


赵渝强老师
36 声望18 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...