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通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
PostgreSQL之连接失败的问题及解决
May 08 PostgreSQL
postgresql中如何执行sql文件
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
PHP入门速成教程
2007/03/19 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
python复制文件代码实现
2013/12/23 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
深入学习python多线程与GIL
2019/08/26 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
使用python实现画AR模型时序图
2019/11/20 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
一些Unix笔试题和面试题
2012/09/25 面试题
实习生体会的自我评价范文
2013/11/28 职场文书