通过使用file_fdw扩展使得PostgreSQL能够访问外部文件系统中的数据文件,同样通过使用postgres_fdw扩展可以使得PostgreSQL能够访问外部远端的PostgreSQL数据库中的数据。视频讲解如下:
下面通过具体的步骤操作来演示如何使用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配置文件,以允许远程登录访问。