dblink 是一个 contrib 模块,它使得查询另一个 PostgreSQL 数据库成为可能,无论是在同一服务器还是远程服务器上。与另一个数据库的交互是通过将查询作为参数传递给由 dblink 模块安装的函数(所有这些函数都以 dblink_... 开头)来实现的。任何生成行的远程数据库查询的输出会以记录集的形式返回,并且可以与本地查询合并。
虽然 dblink 仍然得到支持,但 postgres_fdw 提供了一种更便捷的方式来访问远程 PostgreSQL 数据库。
dblink 在 PostgreSQL 7.2 中添加。
安装
必须在数据库服务器的操作系统上安装 dblink contrib 模块。需要由超级用户使用 CREATE EXTENSION 命令在任何需要 dblink 功能的数据库上安装 dblink(远程数据库不需要 dblink)。
postgres=# CREATE EXTENSION dblink; CREATE EXTENSION
远程数据库的权限
远程数据库必须设置为接收来自本地数据库的连接;请确保 pg_hba.conf 和任何防火墙都已正确配置。对于 dblink 连接,远程服务器不需要特殊的设置;如果您可以从本地服务器使用 psql 连接,您就可以使用 dblink 连接。
定义连接
无需在每次查询时提供完整的连接字符串,可以设置持久连接,用于多个 dblink 调用。
postgres=# SELECT dblink_connect('dbname=testdb host=192.168.1.35 user=someuser');
dblink_connect
----------------
OK
(1 row)
之前的 dblink 远程查询现在可以在没有连接参数的情况下执行
SELECT *
FROM dblink(
/* query to execute */
'SELECT aid, bid, abalance FROM pgbench_accounts LIMIT 10')
/* definition of the columns returned by the query */
AS t1(aid INT, bid INT, abalance INT)
上面的 dblink_connect() 函数创建了一个未命名的连接;在同一个会话中还可以创建多个命名连接(请注意,当然不可能有一个以上的命名连接)。
SELECT dblink_connect('my_dblink_conn','dbname=testdb host=192.168.1.35 user=someuser')
SELECT *
FROM dblink('my_dblink_conn', 'SELECT aid, bid, abalance FROM pgbench_accounts LIMIT 10')
AS t1(aid INT, bid INT, abalance INT)
使用外部数据包装器连接
定义 dblink 连接的更冗长但符合标准的方式是创建 外部数据包装器。这为远程数据库设置了一个全局处理器,这意味着在设置 dblink 连接时不需要提供连接字符串。
1. 创建外部数据包装器(每个数据库只需要一个)
CREATE EXTENSION postgres_fdw;
2. 创建远程服务器
CREATE SERVER remote_db FOREIGN DATA WRAPPER postgres_fdw OPTIONS (hostaddr '192.168.1.35', dbname 'testdb')
(请注意,连接参数以 name/value 对的形式提供)
3. 将本地数据库用户映射到外部服务器
CREATE USER MAPPING FOR fdw_user SERVER remote_db OPTIONS(user 'local_fdwtest',password '54321')
用户名和密码当然是远程服务器上的。
4. 授予对外部服务器的使用权限
GRANT USAGE ON FOREIGN SERVER remote_db TO fdw_user
然后用户 fdw_user 可以这样连接:
postgres=> SELECT dblink_connect('conn1', 'remote_db');
dblink_connect
----------------
OK
(1 row)
postgres=> SELECT *
FROM dblink('conn1', 'SELECT aid, bid, abalance FROM pgbench_accounts LIMIT 2')
AS t1(aid INT, bid INT, abalance INT);
aid | bid | abalance
-----+-----+----------
1 | 1 | 0
2 | 1 | 0
(2 rows)
变更历史
注意:此列表列出了 dblink 的重要更改;有关所有更改的详细信息,请参阅 PostgreSQL 发行说明。
- PostgreSQL 18
- 添加了 SCRAM 身份验证直通支持(提交 3642df26)
- PostgreSQL 17
- 远程查询现在可中断(提交 d3c5f37d)
- PostgreSQL 16
- 当客户端将 GSSAPI 凭证委派给服务器,并且使用 GSSAPI 对远程系统进行身份验证时,允许非超级用户进行无密码连接 (提交 3d4fa227)
- PostgreSQL 9.3
- PostgreSQL 9.1
- PostgreSQL 8.4
- PostgreSQL 8.2
- 添加了异步查询功能(提交 52a3ed9f)
- PostgreSQL 8.0
- 整体重构(提交 6a1e2b3c)
- PostgreSQL 7.4
- 添加了命名持久连接(提交 8f337e86)
- PostgreSQL 7.2
- 添加(提交 5af48553)
示例
一个基本的 dblink 查询如下所示:
SELECT *
FROM dblink(
/* connection string for the remote database */
'dbname=testdb host=192.168.1.35 user=someuser',
/* query to execute */
'SELECT aid, bid, abalance FROM pgbench_accounts LIMIT 10')
/* definition of the columns returned by the query */
AS t1(aid INT, bid INT, abalance INT)
连接字符串是标准的 libpq 连接字符串。远程查询返回的列必须明确定义,因为本地 PostgreSQL 服务器无法知道远程列类型。
参考资料
- PostgreSQL documentation: dblink
