重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1153|回复: 0

如何在pg中直接访问oracle 19c 的某个pdb

[复制链接]
发表于 2023-7-16 18:09:13 | 显示全部楼层 |阅读模式
本帖最后由 郑全 于 2023-7-16 18:14 编辑

方法,目前可以通过oracle_fdw,dblink两种插件的方式来实现,看了一下,dblink使用比较繁琐,ORACLE_FDW更方便,更实用一些,下面以oracle_fdw为例来说明:


没有说明,都是在pg服务器上操作,使用PG数据库的安装用户postgres进行操作。
环境:linux 8.6
          pg:14.8
          oracle:19.19

1.安装 oracle 客户端
   在PG数据库服务器上安装ORACLE 19C的 客户端,可以是完整的ORACLE 19C客户端,也可以是实例客户端,建议使用完整的客户端
   具体安装过程略

2.测试ORACLE客户端可以访问ORACLE数据库
  sql>conn hr/hr@192.168.133.120:1521/orclpdb

3.安装 oracle_fdw
  软件源码:  http://pgxn.org/dist/oracle_fdw/  
  找对应PG版本的ORACLE_FDW版本,目前我们找到的是oracle_fdw 2.5.0
  使用源码安装

   tar oracle_fdw-ORACLE_FDW_2_5_0.tar.gz -C /pg/soft/
   cd /pg/soft/oracle_fdw-ORACLE_FDW_2_5_0/
   make
   make install

4.创建扩展
   create extension oracle_fdw;

--这个操作有时要报错:
ERROR:  could not load library "/postgresql/pg14/lib/oracle_fdw.so": libclntsh.so.19.1: 无法打开共享对象文件: 没有那个文件或目录

postgres@webserver admin]$ ldd oracle_fdw.so
ldd: ./oracle_fdw.so: 没有那个文件或目录
[postgres@webserver admin]$ ldd /postgresql/pg14/lib/oracle_fdw.so
        linux-vdso.so.1 (0x00007ffcc311c000)
        libclntsh.so.19.1 => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007ff708565000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff708b50000)


可以通过软连接解决:
$ ln -s /opt/oracle/instantclient/libclntsh.so.19.1 /postgresql/pg14/lib/libclntsh.so.19.1

如果是即使有那个动态库也可能遇到这个问题

那么需要做如下调整:
vim /etc/ld.so.conf

/postgresql/pg14/lib

即可

   select * from pg_extension;
   oid   |      extname       | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
---------+--------------------+----------+--------------+----------------+------------+-----------+--------------
。。。
2409616 | oracle_fdw         |       10 |         2200 | t              | 1.2        |           |
。。。




5.创建外部数据源服务
create server oradb foreign data wrapper oracle_fdw options(dbserver '192.168.133.120/orclpdb');
6.建用户映射
grant usage on foreign server oradba to postgres;
create user mapping for postgres server oradb options(user 'HR',password 'hr');


7.创建外部表
  create foreign table emp
    (
    empid  numeric(18),
    last_name varchar(20)
    ) server oradb options(schema 'HR',table 'EMP');
8.测试
  select * from emp;

select * from emp;
ERROR: error connecting to oracle: OCIEnvcreate failed to create environment handle
DETAIL:


这个老是报上面的错误,折腾了几个小时,后面通过在
/usr/lib/systemd/system/PG14.service 中,加上 ORACLE_HOME,解决

[Service]

Environment=ORACLE_HOME=/u01/app/oracle/product/19/client_1
。。。

# systemctl daemon-reload
# systemctl stop pg14.service
# systemctl start pg14.service

之后,即不再报错。












回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-6-25 17:55 , Processed in 0.115377 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表