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 22 PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 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
JSON在PHP中的应用介绍
2012/09/08 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
ext jquery 简单比较
2010/04/07 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
Javascript事件实例详解
2013/11/06 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
技校毕业生自荐信
2014/06/03 职场文书
广播体操口号
2014/06/18 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
银行授权委托书样本
2014/10/13 职场文书
河童之夏观后感
2015/06/11 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
git stash(储藏)的用法总结
2022/06/25 Servers