dblink

用于在远程数据库上执行查询的 Contrib 模块

dblink 是一个 contrib 模块,它允许查询另一个 PostgreSQL 数据库,无论是在同一服务器上还是在远程服务器上。与其他数据库的交互是通过将查询作为参数传递给 dblink 模块安装的函数(所有这些函数都以 dblink_... 开头)来完成的。任何生成行的远程数据库查询的输出都将作为记录集返回,并且可以与本地查询组合。

虽然 dblink 仍然受支持,但 postgres_fdw 提供了一种更方便的方式来访问远程 PostgreSQL 数据库。

dblinkPostgreSQL 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 发行说明。

示例

基本的 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

分类

Contrib 模块扩展外部数据包装器 (FDW)复制

另请参阅

postgres_fdw

反馈

提交关于 "dblink" 的任何评论、建议或更正 此处