日期:2014-05-16  浏览次数:20588 次

greenplum到oracle的dbi_link的配置、调试与测试

为了解决greenplum到oracle的数据库的数据互联互通的问题,特提供的dbi_link做了研究与测试,dbi_link的基本原理是用Perl的DBI和相应数据库的DBD来访问异构数据库,实现数据的互访与数据传递,这次研究的目的是想解决oracle数据仓库到greenplum的数据传输的问题,这次的研究大概可以分为以下三个步骤:

一、配置:有关配置详情请见postgresql的专家我们兄弟公司何伟平(laser)同事写的一篇文章“使用dbi-link在PG里访问异构数据库http://www.pgsqldb.org/mwiki/index.php/%E4%BD%BF%E7%94%A8dbi-link%E5%9C%A8PG%E9%87%8C%E8%AE%BF%E9%97%AE%E5%BC%82%E6%9E%84%E6%95%B0%E6%8D%AE%E5%BA%93”,其中就如何配置dbi_link使postgresql访问异构数据访问有详细的说明与讲解,在这里要对laser表示感谢,在我研究greenplum的期间给于了大量的帮助与支持。

二、调试:由于目前dbi_link连接指的是postgresqlr与导构数据库数的联接,虽然greenplum是基于postgresql的数据库,但greenplum为使数据库有分布式与并行的能力屏蔽了postgresql的部分功能,所以在利用dib_link连接oracle的配置过程中运行:

SELECT make_accessor_functions('dbi:Oracle:laser;host=10.0.0.1;sid=dw1;port=1521', 'laser', 'oracle', '--- AutoCommit: 1 RaiseError: 1 ',NULL,NULL,NULL,'oracle_dw1');
时会报错,这其中一个问题是在greenplum中为了解决分布式的问题屏蔽了函数pg_catalog.currval(),这个函数的目的是当插入一个数据表记录时设为SERIAL类型字段会自动产生一个序列值
在数据没有提交的情况下要取这个值同时向另外一个表插入一条记录,其pk也为这个值时用的,为了绕过这个问题就得用到greenplum中的sequence的NEXTVAL(),具体代码见附件。
当调通后,当oracle指定schema下面的数据表大于2个时,在取oracle的数据字典,在greenplum上创建相应的对像时会报下面的错:

server closed the connection unexpectedly

??????? This probably means the server terminated abnormally

??????? before or while processing the request.

The connection to the server was lost. Attempting reset: Succeeded.

使客户端到pg服务端的连接断掉,这个问题目前还没有找到原因,猜测是有可能连接数的问题,还没有得到证实。

三、测试:测试主要是在pg的客户端对oracle数据库进行查询,createtable XXXX as select XXXX的方式传数据进行测试;另外测试是在greenplum与postgresql两个数据库上进行:

greenplum数据库 postgresql