使用PostgreSQL本身提供的扩展插件,例如dblink和postgres_fdw,可以跨库操作表。
背景信息
阿里云RDS for PostgreSQL云盘版实例开放dblink和postgres_fdw插件,支持相同VPC内实例(包括自建PostgreSQL数据库)间的跨库操作。
购买PostgreSQL云盘版实例。
注意事项
PostgreSQL云盘版的dblink和postgres_fdw插件进行跨库操作的注意事项如下:
- 相同VPC内的ECS/RDS PostgreSQL实例可以直接跨库操作。
- 自建PostgreSQL实例可以通过oracle_fdw或mysql_fdw连接VPC外部的Oracle实例或MySQL实例。
- 连接自身跨库操作时,host请填写localhost,port请填写
show port
命令返回的本地端口。
- 需要将RDS PostgreSQL的专有网络网段(例如
172.xx.xx.xx/16
)添加到目标数据库的白名单中,允许RDS PostgreSQL访问。
说明 您可以在RDS PostgreSQL实例的
数据库连接中查看专有网络网段。

使用dblink
- 新建dblink插件。
- 创建dblink连接。
postgres=> select dblink_connect('<连接名称>', 'host=<同一VPC下的另一RDS的内网域名> port=<同一VPC下的另一RDS的内网监听端口> user=<远程数据库用户名> password=<密码> dbname=<库名>');
postgres=> SELECT * FROM dblink('<连接名称>', '<SQL命令>') as <表名>(<列名> <列类型>);
示例
postgres=> select dblink_connect('a', 'host=pgm-bpxxxxx.pg.rds.aliyuncs.com port=3433 user=testuser2 password=passwd1234 dbname=postgres');
postgres=> select * from dblink('a','select * from products') as T(id int,name text,price numeric); //查询远端表

更多详情请参见dblink。
使用postgres_fdw
- 新建一个数据库。
postgres=> create database <数据库名>; //创建数据库
postgres=> \c <数据库名> //切换数据库
示例
postgres=> create database db1;
CREATE DATABASE
postgres=> \c db1
- 新建postgres_fdw插件。
db1=> create extension postgres_fdw;
- 新建远程数据库服务器。
db1=> CREATE SERVER <server名称>
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '<同一VPC下的另一RDS的内网域名>,port '<同一VPC下的另一RDS的内网监听端口>', dbname '<同一VPC下的另一RDS的库名>');
db1=> CREATE USER MAPPING FOR <本地数据库用户名>
SERVER <server名称>
OPTIONS (user '<远程数据库用户名>', password '<远程数据库密码>');
示例
db1=> CREATE SERVER foreign_server1
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'pgm-bpxxxxx.pg.rds.aliyuncs.com', port '3433', dbname 'postgres');
CREATE SERVER
db1=> CREATE USER MAPPING FOR testuser
SERVER foreign_server1
OPTIONS (user 'testuser2', password 'passwd1234');
CREATE USER MAPPING
- 导入外部表。
db1=> import foreign schema public from server foreign_server1 into <SCHEMA名称>; //导入外部表
db1=> select * from <SCHEMA名称>.<表名> //查询远端表
示例
db1=> import foreign schema public from server foreign_server1 into ft;
IMPORT FOREIGN SCHEMA
db1=> select * from ft.products;

更多详情请参见postgres_fdw。