PostgreSQL通过oracle_fdw访问Oracle数据「建议收藏」

PostgreSQL通过oracle_fdw访问Oracle数据「建议收藏」背景: 同一个项目两个系统分别使用了PG库和Oracle库,Oracle是生产库,数据动态更新,现在在PG库中需要实时的获取到更新的数据进行统计,基于此种方式,可以通过ETL的工具实现,但是需要定期进

PostgreSQL通过oracle_fdw访问Oracle数据

背景:

同一个项目两个系统分别使用了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库服务器。

image

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

host      all             all             0.0.0.0/0              md5

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

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

image

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

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

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

imageimage

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

select * from pg_available_extensions;

image

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

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

QQ截图20210513154802

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

imageimage

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

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

image

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

image

5、创建安装oracle_fdw

-- 创建oracle_fdw
create extension oracle_fdw;

image

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

select * from pg_available_extensions;

image

可以看到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");

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

image

7、PG库创建Oracle连接

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

image

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

8、PG库进行用户授权

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

image

授权根据实际需要进行。

9、创建到Oracle的映射

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

image

其中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");

 

image

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

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

image

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

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");

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

image

在PG库中进行查询确认:

image

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

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");

然后查询数据:

image

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

13、性能方面

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

参考资料:

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

PostgreSQL之oracle_fdw安装与使用 – Kevin_zheng – 思创斯聊编程 (cnblogs.com)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6173.html

(0)
上一篇 2023-04-15
下一篇 2023-04-15

相关推荐

  • 可能是全网最好的MySQL重要知识点/面试题总结「建议收藏」

    可能是全网最好的MySQL重要知识点/面试题总结「建议收藏」标题有点标题党的意思,看了文章之后希望大家不会有这个想法,绝对干货!!!这篇花文章是我花了几天时间对之前总结的MySQL知识点做了完善后的产物,这篇文章可以用来回顾MySQL基础知识以及备战MySQ…

    2023-01-28
    159
  • MySQL 间隙锁导致的死锁场景分析[亲测有效]

    MySQL 间隙锁导致的死锁场景分析[亲测有效]mysql间隙锁引起的死锁分析

    2023-06-18
    148
  • Python之Sqlite3数据库基本操作[亲测有效]

    Python之Sqlite3数据库基本操作[亲测有效] 在一些小的应用中,难免会用到数据库,Sqlite数据库以其小巧轻便,无需安装,移植性好著称,本文主要以一个简单的小例子,简述Python在Sqlite数据库方面的应用,仅供学习分享使用,如有…

    2023-03-28
    156
  • 使用Python Tutor进行代码可视化学习

    使用Python Tutor进行代码可视化学习Python作为一门高级编程语言,非常的受欢迎。Python的简移易学是其受欢迎的原因之一,但是学习编程仍然对初学者来说是一项挑战。Python Tutor是一种工具,帮助添加视觉元素到Python代码,它能帮助完全没有编程知识的人学习基础的编程概念。在这篇文章中,我们将介绍如何使用Python Tutor和一些常见的编程概念,包括变量、条件语句和循环。

    2024-04-26
    61
  • Explain详解与索引优化实践

    Explain详解与索引优化实践为什么要用explain 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈 如何使用explain 下面是使用 …

    2022-12-16
    129
  • 使用JavaScript移除字符串末尾字符的简单方法

    使用JavaScript移除字符串末尾字符的简单方法JavaScript中的字符串有一个名为 codeslice()/code 的方法,该方法可以从字符串中提取指定的部分,并将其作为新的字符串返回。当 codeslice()/code 方法只有一个参数时,它将返回从该参数开始到字符串末尾的所有字符。

    2024-05-29
    60
  • 思维进阶 分组内排序 然后每组取前2条「建议收藏」

    思维进阶 分组内排序 然后每组取前2条「建议收藏」select p_type,p_name,p_view, IF(@pre=p_type,@rownum:=@rownum+1,@rownum:=1),@pre:=p_type from (selec…

    2023-03-08
    144
  • 用Python构建强大的对象导向程序

    用Python构建强大的对象导向程序Python是一种动态、解释性、高级编程语言,被广泛用于数据科学、机器学习、Web应用开发等领域。Python的强大之处在于它提供了多种编程风格,其中面向对象编程(Object Oriented Programming,简称OOP)是最为流行且有效的方式之一。本文旨在探讨如何用Python构建强大的对象导向程序,分别从以下几个方面展开。

    2024-02-12
    87

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注