您现在的位置是:首页 >学无止境 >opengauss编译和使用oracle_fdw网站首页学无止境
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)