dblink
是一个 contrib 模块,它允许查询另一个 PostgreSQL 数据库,无论是在同一服务器上还是在远程服务器上。与其他数据库的交互是通过将查询作为参数传递给 dblink
模块安装的函数(所有这些函数都以 dblink_...
开头)来完成的。任何生成行的远程数据库查询的输出都将作为记录集返回,并且可以与本地查询组合。
虽然 dblink
仍然受支持,但 postgres_fdw
提供了一种更方便的方式来访问远程 PostgreSQL 数据库。
dblink
在 PostgreSQL 7.2 中添加。
安装
必须在数据库服务器的操作系统上安装 dblink
contrib 模块。dblink
需要由超级用户使用 CREATE EXTENSION
命令在任何需要 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')
(请注意,连接参数以名称/值对的形式提供)
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 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 文档: dblink