您现在的位置是:首页 >学无止境 >opengauss编译和使用oracle_fdw网站首页学无止境

opengauss编译和使用oracle_fdw

howard_shooter 2023-06-19 12:00:03
简介opengauss编译和使用oracle_fdw

opengauss虽然继承自postgresql9.2,但由于做了魔改,网上通用的从oracle_fdw源码编译安装到postgresql的方法,是否成功的应用到opengauss,并不一定,今天试了一下,参照opengauss官网文档(其实写的很简单,缺乏例子)。其实,与opengauss适配的oracle_fdw源码在third_party仓里的kernel/dependency/oracle_fdw,整个过程,除了编译安装,使用过程与postgresql上的oracle_fdw相同。

由于opengauss官网文档缺乏使用oracle_fdw的详细描述或例子,我只好参考网上postgresql上的oracle_fdw的配置过程,结果成功了。而网上专门针对opengauss的oracle_fdw配置使用文章几乎没有。

看了许多别人的分享,学到很多也解决了很多工作中的问题,我也把我的经验分享一下。

一、编译安装

首先oracle_fdw是在opengauss编译时,与它一起编译的,而不是单独编译的,这一点与通用的postgresql oracle_fdw插件不同(opengauss的编译我就不介绍了),在编译opengauss时,configure中指定--enable-oracle-fdw,就可以一起把oracle_fdw编译出来,并且make install时也会安装相关文件和库,但是,有个前提,就是编译机器上要安装unixODBC 和oracle客户端:

unixODBC 通过源码安装,并不复杂。

oracle客户端包括:

oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm

二、使用oracle_fdw

首先需要创建extension

CREATE EXTENSION ORACLE_FDW;

这一步可能会报错缺少so

openGauss=# create extension oracle_fdw;

ERROR:  could not load library "oracle_fdw.so": libclntsh.so.12.1: cannot open shared object file: No such file or directory

需要将libclntsh.so.12.1所在目录,例如/usr/lib/oracle/12.2/client64/lib加入/etc/ld.so.conf,然后以root执行ldconfig,对于三个节点的主备集群,每个节点都要这样做。

然后创建server:

create server oracle_test foreign data wrapper oracle_fdw options(dbserver '172.32.150.13:1521/nlpass01');

这一步创建名称为oracle_test的server,server代表一个远程oracle服务器,可以看到server中包含了远程oracle服务器的连接字符串:包括IP,端口,SID,但是不包括用户名密码。

其中options(dbserver '172.32.150.13:1521/nlpass01');既可以直接写oracle服务器的IP也可以引用tnsnames.ora里定义的连接名称,例如,tnsnames.ora文件内容为:

orcl_test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.32.150.13)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = nlpass01)
    )
  )
 

则创建server的语句,也可以写成:

 create server oracle_test foreign data wrapper oracle_fdw options(dbserver 'orcl_test');

在opengauss/bin目录下创建usermapping.key.cipher文件。每个节点都要做这个操作,也可以在安装时先创建到opengauss/bin,再打包分发,就是所有节点共用一份。

gs_guc generate -o usermapping -S default -D $GAUSSHOME/bin

然后创建user mapping

create user mapping for postgres server oracle_test options (user 'paastest', password 'Ptest1015');

这是创建opengauss用户到oracle_test所指的远程oracle服务器的用户映射。映射的是opengauss的postgres用户到oracle服务器上的paastest用户,同时包括了paastest的密码。

然后创建外部表,即远程oracle上的表到opengauss本地表的映射:

create foreign table fdw_test01( id int options(key 'true'),

                                                   name varchar(64) options(key 'true'),

                                                   hiredate timestamp,

                                                   resume text)

server oracle_test options (schema 'PAASTEST',table 'FDW_TEST01');

这条件语句,创建了一个名为fdw_test01的外部表,它的列名和类型定义,应该与远程oracle表一一对应或兼容(其实列名甚至列数不同也可以,不过最好不要这样做)。

语句的后半部分,指定了fdw_test01要映射到哪个远程oracle服务器(oracle_test),哪个schema(PAASTEST),哪个表(FDW_TEST01)。

还有一点很重要,oracle侧组成主键的列,在opengauss侧每个对应的列,定义时要加options(key 'true')属性,表示它是主键列,否则update或delete外部表时会报错。

上面的外表对应oracle表定义为:

create table fdw_test01 ( id int,

                                         name varchar2(64),

                                         hiredate timestamp,

                                         resume clob,

                                         primary key (id, name));

有趣的是,即使oracle侧的表没有定义主键,opengauss侧定义的外表也要求至少一个列有options(key 'true')属性,否则是没法进行update和delete操作的,而且即使opengauss测试定义了key列,oracle侧这个列有重复也不能update和delete,所以,最好oracle侧的表定义了主键。

三、opengauss 查看外部表信息

注意,下面的命令都是在opengauss上执行的,不是在oracle上执行的。

查看都有哪些data wrapper:

dew

查看都有哪些foreign data server: 

des+

 查看都有哪些foreign table:

det+

 查看oracle诊断信息:

参考:

PostgreSQL Insider - How to link to Oracle databases using oracle_fdw (part 1) (fastware.com)

PostgreSQL Insider - How to link to Oracle databases using oracle_fdw (part 2) (fastware.com)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。