Greenplum数据库的dblink功能之搭建

1、什么是dblink
    dblink是一个PostgreSQL contrib模块,允许对另一个数据库执行查询。
  当前PostgreSQL的模型需要用户连接到一个特定的数据库服务器上。因此,它本身是不可能对另一个数据库执行SQL查询。
  通常我们不鼓励使用dblink查询远程数据库。
  我们总是建议用户使用模式。但有时,这也许还不够。
    不管怎样,这篇文章向您展示如何PostgreSQL和Greenplum是相关的。


2、准备: 
   greenplum数据库:
   检查环境:看是否已经安装了,如果已经安装了,直接跳到第4步。
   gpadmin@linux-hd1:~> pg_config --pkglibdir
   /usr/local/greenplum-db/lib/postgresql/
   
   然后在上边这个目录里检查一下各个节点主机的是否安装。(all_host:包含你所有主备用控制节点和数据节点)
   gpadmin@linux-hd1:~> gpssh -f all_host 'll /usr/local/greenplum-db/lib/postgresql/dblink.so'
   
    1、主节点上没有,其他节点上有的,建议重新安装DBLINK组件
    2、主节点上有,其他节点上没有的,将主节点上的文件复制到其他节点上。
   
  
3、安装dblink组件
   
   postgressql8.2版本的源代码:(建议使用8.2的版本,9.2版本在编码的时候报错,提示少文件)
   下载地址:http://www.postgresql.org/ftp/source/v8.2.23/
   
   上传到GREENPLUM数据库主节点上,如:上传至/home/gpadmin
   
   *解压缩
   gpadmin@linux-hd1:~> tar vxf postgresql-8.2.23.tar.gz
   
   *进入dblink目录:
   gpadmin@linux-hd1:~> cd /home/gpadmin/postgresql-8.2.23/contrib/dblink/
   
   *编辑 Makefile,在第PG_CPPFLAGS语句后面加上-w(通常是在第4行,作用是忽略警告),修改后如下:
   
    PG_CPPFLAGS = -I$(libpq_srcdir) -w
    
   *编译代码
   gpadmin@linux-hd1:~/postgresql-8.2.23/contrib/dblink> make USE_PGXS=1 install
sed 's,MODULE_PATHNAME,$libdir/dblink,g' dblink.sql.in >dblink.sql
gcc -m64 -O3 -funroll-loops -fargument-noalias-global -fno-omit-frame-pointer -g -finline-limit=1800 -std=gnu99  -Wall -Wmissing-prototypes -Wpointer-arith  -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -I/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/include -Werror -fpic -I/usr/local/greenplum-db-4.2.2.4/include -w -I. -I/usr/local/greenplum-db-4.2.2.4/include/postgresql/server -I/usr/local/greenplum-db-4.2.2.4/include/postgresql/internal -D_GNU_SOURCE  -I/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/include -I/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/include/libxml2  -c -o dblink.o dblink.c
gcc -m64 -O3 -funroll-loops -fargument-noalias-global -fno-omit-frame-pointer -g -finline-limit=1800 -std=gnu99  -Wall -Wmissing-prototypes -Wpointer-arith  -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -I/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/include -Werror -fpic -shared  dblink.o  -L/usr/local/greenplum-db-4.2.2.4/lib -L/usr/local/greenplum-db-4.2.2.4/lib -L/usr/local/greenplum-db-4.2.2.4/lib -L/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/lib -L/home/build/builds/greenplum-db/Release-4_2_2_4-build-1_rc_100312-1300/Release-4_2_2_4-build-1_src/ext/suse10_x86_64/lib -lpq -Wl,-rpath,'/usr/local/greenplum-db-4.2.2.4/lib',--enable-new-dtags -o dblink.so
/bin/mkdir -p '/usr/local/greenplum-db-4.2.2.4/lib/postgresql'
/bin/sh /usr/local/greenplum-db-4.2.2.4/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -m 755  dblink.so '/usr/local/greenplum-db-4.2.2.4/lib/postgresql/dblink.so'
/bin/sh /usr/local/greenplum-db-4.2.2.4/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./uninstall_dblink.sql '/usr/local/greenplum-db-4.2.2.4/share/postgresql/contrib'
/bin/sh /usr/local/greenplum-db-4.2.2.4/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -m 644 dblink.sql '/usr/local/greenplum-db-4.2.2.4/share/postgresql/contrib'
/bin/sh /usr/local/greenplum-db-4.2.2.4/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./README.dblink '/usr/local/greenplum-db-4.2.2.4/doc/postgresql/contrib'
   
   *分发dblink.so到各台主机的指定目录下:
  
   注意下边这个/home/gpadmin/host_all文件里要包含你所有的主用备用控制节点和数据节点
   gpadmin@linux-hd1:~/postgresql-8.2.23/contrib/dblink> gpscp -f all_host dblink.so =:/usr/local/greenplum-db/lib/postgresql/dblink.so
   
4、创建dblink相关的系统函数:注意这个my_db是你的本地数据库名。
   gpadmin@linux-hd1:~> psql -f dblink.sql my_db
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
REVOKE
REVOKE
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TYPE
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
   
5、测试dblink
  
  *如果是在一个数据库实例里,可以不用写远程主机、用户名密码等。
  *myconn是一个描述符号
  *dbname=bi:是数据库连接串。本地可以这样写,远程得写成hostaddr=***.***.***.*** port=5432 dbname=*** user=*** password=***
  *insert * from select语句不能使用myconn 得写数据库连接串
  
gpadmin@linux-hd1:~> psql my_db
psql (8.2.15)
Type "help" for help.

my_db=# \l
                 List of databases
  Name    |  Owner  | Encoding |  Access privileges  
-----------+---------+----------+---------------------
bi        | gpadmin | UTF8     | 
createdb  | gpadmin | UTF8     | 
my_db     | gpadmin | UTF8     | 
postgres  | gpadmin | UTF8     | 
template0 | gpadmin | UTF8     | =c/gpadmin          
                               : gpadmin=CTc/gpadmin
template1 | gpadmin | UTF8     | =c/gpadmin          
                               : gpadmin=CTc/gpadmin
(6 rows)

my_db=# select dblink_connect('myconn','dbname=bi');
dblink_connect 
----------------
OK
(1 row)
my_db=# select dblink_connect('myconn','dbname=bi');
ERROR:  duplicate connection name
my_db=# select * from dblink('myconn','select * from public.a');
ERROR:  a column definition list is required for functions returning "record"
LINE 1: select * from dblink('myconn','select * from public.a');
                     ^
my_db=# select * from dblink('myconn','select * from public.a') AS t1(v varchar) LIMIT 5;
v  
----
3
21
41
4
11
(5 rows)

my_db=# select * from dblink('myconn','select * from public.a') AS t1(v1 varchar);
v1 
----
1
31
2
3
21
41
4
11
(8 rows)

my_db=# insert into public.ab select * from dblink('myconn','select * from public.a') AS t1(v1 varchar);
ERROR:  could not establish connection  (entry db linux-hd1:5432 pid=6389)
DETAIL:  missing "=" after "myconn" in connection info string
my_db=# insert into public.ab select * from dblink('dbname=bi','select * from public.a') AS t1(v1 varchar);
INSERT 0 8
my_db=# select * from public.ab
my_db-# ;
v1 
----
21
4
1
3
41
31
2
11
(8 rows)

my_db=# 

至此结束。

猜你喜欢

转载自weitao1026.iteye.com/blog/2359668