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