# 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函数创建视图)。