dblink外部表导入数据
本页目录
dblink外部表导入数据#
本节通过一个简单的例子来说明如何通过dblink导入数据。 例如本集群有两个database,一个是source_db,一个local_db,我们的目的是用普通用户normal_user,在local_db中访问source_db中的数据,并加载到local_db中。
数据源DB数据加载
创建dblink extension并赋权
目标DB通过dblink加载数据源DB的数据
数据源DB中数据加载#
用户source_user登陆source_db
source_db=# create schema myschema;
CREATE SCHEMA
source_db=# set search_path=myschema;
source_db=# create table foo(f1 int, f2 text,f3 text[]);
CREATE TABLE
source_db=# INSERT INTO foo (f1, f2, f3) VALUES
source_db-# (1, 'a', ARRAY['aa', 'a1']),
source_db-# (2, 'b', ARRAY['bb', 'b2']),
source_db-# (3, 'c', ARRAY['cc', 'c3']);
INSERT 0 3
目标DB中创建dblink extension并赋权#
超级用户登录local_db,并使用如下命令创建dblink extension
create extension dblink;
超级用户登录local_db,赋权dblink相关的函数给普通用户normal_user
GRANT EXECUTE ON FUNCTION dblink(text, text, boolean) TO normal_user;
GRANT EXECUTE ON FUNCTION dblink_connect(text, text) TO normal_user;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO normal_user;
目标DB中通过dblink加载数据源DB的数据#
用户normal_user登录local_db,并创建目标表
local_db=# create table local_foo(c1 int, c2 text, c3 text[]);
CREATE TABLE
创建一个视图,视图中连接到目标db,并添加适当的连接参数和查询语句。
local_db=# create or replace view v1 as select from dblink('hostaddr=127.0.0.1 port=7000 user=user_name password=123456 dbname=source_db connect_timeout=600 options=-csearch_path=myschema', 'select f1,f2,f3 from foo', true)
as t2(f1 int,f2 text,f3 text[]);
CREATE VIEW
通过视图来加载数据到本地表
local_db=# insert into local_foo select * from v1;
INSERT 0 3
local_db=# select * from local_foo;
c1 | c2 | c3
----+----+---------
1 | a | {aa,a1}
2 | b | {bb,b2}
3 | c | {cc,c3}
(3 rows)
dblink使用限制
1. 目前仅支持两种dblink场景(1)同一集群内部database之间的dblink(2)不同集群之间database的dblink。
2. dblink仅在master进行远端的数据汇总,并没有任何并发和计算下推等优化,所以性能受限。
3. 使用dblink函数参与本地计算或者insert等操作时,请使用连接信息字符串作为首个参数,而不是已经存在的连接名。(方便起见,可以提前为dblink函数创建视图)。