PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤


Posted in PostgreSQL onMay 21, 2021

背景:

同一个项目两个系统分别使用了PG库和Oracle库,Oracle是生产库,数据动态更新,现在在PG库中需要实时的获取到更新的数据进行统计,基于此种方式,可以通过ETL的工具实现,但是需要定期进行维护等,于是想着是否可以通过类似于Oracle数据库DBLINK的方式去实现,经过网上查找相关资料,发现可以通过oracle_fdw实现。

测试环境:

本地搭建测试环境,基础配置如下:

Oracle数据库测试服务器(IP:192.168.1.110):WIN10操作系统,Oracle数据库版本为11.2.0.4,实例名为orcl,安装有32位客户端;

PG库测试服务器(虚拟机,IP:192.168.30.128,NAT模式):WIN10操作系统,PG数据库版本为11.11.1;

实现步骤:

1、首先确定网络通常,在PG库服务器可以访问到Oracle库服务器。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

2、安装PG库(步骤略)。这里需要注意,安装完成的PG库没有开启远程访问,如果需要远程访问,需要先修改pg_hba.conf文件,添加以下内容即可。

host all all 0.0.0.0/0 md5

3、下载oracle_fdw,注意下载时候需要匹配PG库的版本。

下载地址:Releases · laurenz/oracle_fdw · GitHub

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

我这里下载的是匹配PG11,选择Windows64位置操作系统的。

注意:fdw版本必须和PG库版本以及操作系统版本相对应,否则后面会出问题。

3、解压oracle_fdw,将【lib】和【share/extension】文件夹中文件拷贝到PG库安装路径下对应的【lib】和【share/extension】文件夹中。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

拷贝之后,通过sql语句可以查询到oracle_fdw,说明文件拷贝放置成功,但是尚未安装(isstalled_version为空)。

select * from pg_available_extensions;

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

4、安装Oracle客户端(步骤略)

先不用急着安装oracle_fdw(安装也不会成功),因为还需要Oracle客户端支持。如果不安装Oracle客户端,会有下面的错误提示。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

Oracle客户端建议和连接的Oracle服务端采用相同版本(测试有小版本差别也不影响,大版本未测试),另外看网上资料也可以按照轻量级的oracle instant client替代,这里我没有试过,有兴趣的可以尝试一下。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

安装完成后注意先进行连接测试,确保连接正常。

注意:客户端的版本必须和PG库的一致,例如我安装的是64位的PG库,那么一定要安装64位的oracle客户端,之前习惯安装了32位的客户端,在创建外部表后没法打开,提示下面错误。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

如果还是有问题,可以检查安装路径是否已经写入Path变量中,将其移动至最上面。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

5、创建安装oracle_fdw

-- 创建oracle_fdw
create extension oracle_fdw;

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

安装成功后通过下面之前的语句进行验证。

select * from pg_available_extensions;

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

可以看到installed_version已经显示安装版本了,验证表示安装成功。

注意:如果多次安装失败,建议可以重启一下PG服务或者服务器后重试。

6、Oracle库中制作测试数据

数据库连接信息如下:192.168.1.110/orcl 用户名/密码:GIS/GIS

-- Create test table
create table ORACLEDATA_TEST
 (
   ID   NUMBER(10) not null,
   XZQMC        NVARCHAR2(50),
   XZQDM        NVARCHAR2(30)
 )
-- insert test data
insert into oracledata_test values(1,'市南区','370202');
insert into oracledata_test values(2,'市北区','370203');

增加测试数据后注意进行提交操作。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

7、PG库创建Oracle连接

--创建Oracle外部连接,其中oradb_110为连接名称
create server oradb_110 foreign data wrapper oracle_fdw options(dbserver '192.168.1.110/orcl');

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

创建后可以通过连接获取Oracle数据库数据。

8、PG库进行用户授权

--授权
grant usage on foreign server oradb_110 to postgres;

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

授权根据实际需要进行。

9、创建到Oracle的映射

--创建到oracle的映射
create user mapping for postgres server oradb_110 options(user 'GIS',password 'GIS');

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

其中oradb_110是之前创建的数据库连接名称,GIS为连接Oracle的用户名和密码。

10、创建需要访问Oracle的对应表

注意这里创建的时候要注意字段类型的转换,Oracle和PG库在字段类型上还是有所差别的。其中oradb_110是我们上面创建的数据库连接名称,GIS是连接。

--创建需要访问的oracle中对应表的结构
create foreign  table ORACLEDATA_TEST_PG
 (
   ID   numeric(10) not null,
   XZQMC        VARCHAR(50),
   XZQDM        VARCHAR(30)
 ) server oradb_110 options(schema 'GIS',table 'ORACLEDATA_TEST');

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

注意:这里建立的表并不像是视图那样获取oracle指定表中的字段,而是通过顺序映射的方式,后面会进行测试说明。

11、现在通过外部表即可查看Oracle过来的数据。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

如果需要对创建的内容进行删除,可以使用下面语句:

DROP FOREIGN TABLE table_name;
DROP USER MAPPING FOR user_name SERVER server_name;
DROP SERVER server_name;

11、数据同步测试。

在oracle数据库中实时插入一条记录

-- insert test data
insert into oracledata_test values(3,'李沧区','370203');

插入数据后注意提交,然后查询确认。

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

在PG库中进行查询确认:

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

可以看到,数据可以实时的同步过去。

12、表映射测试。

例如现在的测试表中有三个字段,我在PG库中如果只用到第一个和第三个字段,那我的外部表这样去构建:

--创建需要访问的oracle中对应表的结构
create foreign  table ORACLEDATA_TEST_PG_2
 (
   ID   numeric(10) not null,
   XZQDM        VARCHAR(30)
 ) server oradb_110 options(schema 'GIS',table 'ORACLEDATA_TEST');

然后查询数据:

PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

从结果中可以看出,我们选择的xzqdm获取到的并非是xzqdm的值,而是xzqmc的值,其为根据顺序映射的,并非是通过字段名称映射。

13、性能方面

初步测试了一下,对于大数据量性能还是比较低的,这块没有进行严格的测试,后面有机会可以再补充。

参考资料:

详解PostgreSQL成功安装oracle_fdw方法,解决the specified procedure could not be found错误_ljinxin的博客-CSDN博客

PostgreSQL之oracle_fdw安装与使用 - Kevin_zheng - 博客园 (cnblogs.com)

到此这篇关于PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤的文章就介绍到这了,更多相关PostgreSQL访问Oracle数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PostgreSQL 相关文章推荐
PostgreSQL存储过程实用脚本(二):创建函数入门
Apr 05 PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
PostgreSQL逻辑复制解密原理解析
Sep 23 PostgreSQL
postgresql之greenplum字符串去重拼接方式
May 08 PostgreSQL
PostgreSQL存储过程实用脚本(二):创建函数入门
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 #PostgreSQL
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Centos环境下Postgresql 安装配置及环境变量配置技巧
如何使用PostgreSQL进行中文全文检索
May 27 #PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 #PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 #PostgreSQL
You might like
第三节--定义一个类
2006/11/16 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
python实现一次创建多级目录的方法
2015/05/15 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python的常用模块之collections模块详解
2018/12/06 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
关于抽烟的检讨书
2014/02/25 职场文书
担保书格式及范文
2014/04/01 职场文书
员工保密协议书
2014/09/27 职场文书
安全员岗位职责
2015/02/10 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
商标侵权律师函
2015/05/27 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书