9.7.3 dblink的使用

2019-08-05 14:47:41 浏览数 (1)

9.7.3 dblink的使用

dblink函数可以方便的访问当前集群或其他集群数据库中的数据,

9.7.3.1 安装dblink函数

进入到GP安装目录下

# cd $GPHOME/share/postgresql/contrib

$ psql -d chinadaas -f dblink.sql

chinadaas : 制定的数据库

dblink默认的安装在制定数据库的public下

9.7.3.2 查看安装后的dblink函数

每个函数的含义请参考:

https://www.postgresql.org/docs/9.6/dblink.html

9.7.3.3 使用dblink读取不同数据库中的数据
9.7.3.3.1 在数据库中创建测试表

$ psql -d stagging

psql (8.3.23)

Type "help" for help.

stagging=# CREATE TABLE testdblink (a int, b text) DISTRIBUTED BY (a);

CREATE TABLE

stagging=# INSERT INTO testdblink VALUES (1, 'Cheese');

INSERT 0 1

stagging=# INSERT INTO testdblink VALUES (2, 'Fish');

INSERT 0 1

以上是在stagging数据库中创建了testdblink 表

9.7.3.3.2 使用dblink读取数据

以下登录的是chinadaas数据库,在以上中已经在chinadaas安装上了dblink函数

$ psql -d chinadaas

psql (8.3.23)

Type "help" for help.

在本地Greenplum数据库系统上创建一个到stagging数据库的命名连接

chinadaas=# SELECT dblink_connect('mylocalconn', 'dbname=stagging');

dblink_connect

----------------

OK

(1 row)

建立一个到远程数据库系统的连接

chinadaas=# SELECT dblink_connect('host=192.168.31.50 port=5432 dbname=stagging');

dblink_connect

----------------

OK

(1 row)

读取其他数据库中的数据,注意必须as一个表来映射其他数据库中的表的字段,字段类型最好一致

chinadaas=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);

id | product

---- ---------

2 | Fish

1 | Cheese

(2 rows)

按照制定条件查询数据

chinadaas=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text) where id='3';

id | product

---- ---------

3 | sd

3 | sd

(2 rows)

把其他数据库表中的数据保存到本地

保存方式一

chinadaas=# CREATE TABLE testdbllocal (a int, b text) DISTRIBUTED BY (a);

CREATE TABLE

chinadaas=# INSERT INTO testdbllocal select * FROM dblink('dbname=stagging', 'SELECT * FROM testdblink') AS dbltab(id int, product text);

INSERT 0 2

保存方式二

chinadaas=# create table testdbllocal2 as select * FROM dblink('dbname=stagging', 'SELECT * FROM testdblink') AS dbltab(id int, product text) DISTRIBUTED BY (id);

SELECT 2

9.7.3.3.3 销毁当前的dblink链接

查看当前的链接

chinadaas=# select dblink_get_connections();

dblink_get_connections

------------------------

{mylocalconn}

(1 row)

销毁当前的链接

chinadaas=# SELECT dblink_disconnect('mylocalconn');

dblink_disconnect

-------------------

OK

(1 row)

9.7.3.4 使用dblink更新数据

更新表示最好现开启事务

-- 先执行dblink_connect保持连接

SELECT dblink_connect('mylocalconn','host=192.168.31.50 dbname=stagging');

-- 执行BEGIN命令

SELECT dblink_exec('mylocalconn', 'BEGIN');

-- 执行数据操作(update,insert,create等命令)

SELECT dblink_exec('mylocalconn', 'insert into testdblink(a,b) values(3,''sd'') ');

-- 执行事务提交

SELECT dblink_exec('mylocalconn', 'COMMIT');

-- 解除连接

SELECT dblink_disconnect('mylocalconn');

9.7.3.5 使用视图查询数据

chinadaas=# create view dblink_view_test as select * from dblink('mylocalconn', 'select * from testdblink') as dbltab(id int, product text) where id='3';

CREATE VIEW

chinadaas=# select * from dblink_view_test;

id | product

---- ---------

3 | sd

3 | sd

(2 rows)

9.7.3.6 dblink使用注意事项
9.7.3.6.1 superuser用户访问dblink

superuser用户可以随意访问dblink的dblink_connect与dblink_connect_u链接,例如:

chinadaas=# SELECT dblink_connect('dbname=stagging');

dblink_connect

----------------

OK

(1 row)

chinadaas=# SELECT * FROM dblink('SELECT * FROM testdblink') AS dbltab(id int, product text) where id='3';

id | product

---- ---------

3 | sd

3 | sd

(2 rows)

9.7.3.6.2 非superuser用户访问dblink会提示让填写链接信息

chinadaas=> SELECT dblink_connect('dbname=stagging');

ERROR: host is required

DETAIL: Non-superusers must provide a host in the connection string.

链接方式一

chinadaas=> SELECT dblink_connect('mylocalconn','host=192.168.31.50 user=xiaoxu password=gpadmin dbname=stagging');

dblink_connect

----------------

OK

(1 row)

链接方式二

chinadaas=> SELECT dblink_connect_u('mylocalconn','dbname=stagging');

ERROR: permission denied for function dblink_connect_u

需要先给用户赋予函数的执行权限,否则回报以上的错误

chinadaas=> SELECT dblink_connect_u('mylocalconn','dbname=stagging');

dblink_connect_u

------------------

OK

(1 row)

或使用以下链接

chinadaas=> SELECT dblink_connect_u('dbname=stagging');

dblink_connect_u

------------------

OK

(1 row)

0 人点赞