dblink

dblink

dblink模块支持从数据库会话中连接到其他Greenplum数据库数据库。 这些数据库可以驻留在相同的Greenplum数据库系统中,也可以驻留在远程系统中。

Greenplum数据库支持Greenplum数据库安装中具有相同主要版本号的数据库之间的dblink连接。 您还可以使用dblink连接到使用兼容libpq库的其他Greenplum数据库安装。

Note: dblink适用于数据库用户在其他数据库中执行简短的临时查询。 dblink不能替代外部表或gpcopy之类的管理工具。

Greenplum数据库dblink模块是PostgreSQL dblink模块的修改版本。 在Greenplum数据库中使用该模块时,存在一些限制。

安装和注册模块

当您安装Greenplum数据库时,将安装dblink模块。 在使用模块中定义的任何函数之前,必须在要使用这些函数的每个数据库中注册dblink扩展。

Greenplum数据库注意事项

在此版本的Greenplum数据库中,修改表数据的语句不能使用命名或隐式dblink连接。 而是必须直接在dblink()函数中提供连接字符串。例如:
gpadmin=# CREATE TABLE testdbllocal (a int, b text) DISTRIBUTED BY (a);
CREATE TABLE
gpadmin=# INSERT INTO testdbllocal select * FROM dblink('dbname=postgres', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
INSERT 0 2
dblink的Greenplum数据库版本禁用以下异步函数:
  • dblink_send_query()
  • dblink_is_busy()
  • dblink_get_result()

使用dblink

以下过程确定了在Greenplum数据库中配置和使用dblink的基本步骤。 这些示例使用dblink_connect()创建与数据库的连接,并使用dblink()执行SQL查询。

  1. 首先创建一个示例表以使用dblink函数进行查询。 这些命令在postgres数据库中创建一个小表,稍后您将使用dblinktestdb数据库中查询该表:
    $ psql -d postgres
    psql (9.4.20)
    Type "help" for help.
    
    postgres=# CREATE TABLE testdblink (a int, b text) DISTRIBUTED BY (a);
    CREATE TABLE
    postgres=# INSERT INTO testdblink VALUES (1, 'Cheese'), (2, 'Fish');
    INSERT 0 2
    postgres=# \q
    $
  2. 以超级用户身份登录到另一个数据库。 在此示例中,超级用户gpadmin登录到数据库testdb。 如果dblink函数尚不可用,请在数据库中注册dblink扩展:
    $ psql -d testdb
    psql (9.4beta1)
    Type "help" for help.
    
    testdb=# CREATE EXTENSION dblink;
    CREATE EXTENSION
  3. 使用dblink_connect()函数创建与另一个数据库的隐式或命名连接。 您提供的连接字符串应该是libpq样式的关键字/值字符串。 本示例创建一个名为mylocalconn的连接到本地Greenplum数据库系统上的postgres数据库:
    testdb=# SELECT dblink_connect('mylocalconn', 'dbname=postgres user=gpadmin');
     dblink_connect
    ----------------
     OK
    (1 row)
    Note: 如果未指定user,则在启动Greenplum数据库时,dblink_connect()将使用PGUSER环境变量的值。 如果未设置PGUSER,则默认值为启动Greenplum数据库的系统用户。
  4. 使用dblink()函数可使用已配置的连接查询数据库。 请记住,此函数返回记录类型,因此您必须分配dblink()查询中返回的列。 例如,以下命令使用命名连接来查询您先前创建的表:
    testdb=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
     id | product
    ----+---------
      1 | Cheese
      2 | Fish
    (2 rows)

要以另一个用户身份连接到本地数据库,请在连接字符串中指定该用户。 本示例以用户test_user的身份连接到数据库。 使用dblink_connect(),超级用户无需指定密码即可创建与另一个本地数据库的连接。

testdb=# SELECT dblink_connect('localconn2', 'dbname=postgres user=test_user');
要建立与远程数据库系统的连接,请在连接字符串中包含主机和密码信息。 例如,要创建到远程系统的隐式dblink连接:
testdb=# SELECT dblink_connect('host=remotehost port=5432 dbname=postgres user=gpadmin password=secret');

附加模块文档

有关此模块中各个函数的详细信息,请参考PostgreSQL文档中的dblink