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无序uuid性能测试及对数据库的影响
Jun 11 PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
PostGIS的安装与入门使用指南
Jan 18 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL数据库去除重复数据和运算符的基本查询操作
Apr 12 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL逻辑复制解密原理解析
Sep 23 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学习之PHP表达式
2006/10/09 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
Python操作MySQL简单实现方法
2015/01/26 Python
python简单判断序列是否为空的方法
2015/06/30 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
python实现rsa加密实例详解
2017/07/19 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
编程实现去掉XML的重复结点
2014/05/28 面试题
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
毕业生就业自荐书
2013/12/15 职场文书
银行内勤岗位职责
2014/04/09 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
《我是什么》教学反思
2016/02/16 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
决心书格式及范文
2019/06/24 职场文书