PG 14.8 如何访问 ORACLE 19C 多租户下的PDB

平时,我们见的比较多的是ORACLE通过DBLINK访问其他数据库,比如SQLSERVER,MYSQL,PG等,那么PG要访问ORACLE,有什么办法?

答案是肯定的,PG可以通过oracle_fdw,DBLINK两种插件 来实现,通过实践,发现 oracle_fdw 更好一些,下面是以ORACLE_FDW插件为例来演示:

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

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 oradb 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

之后,即不再报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值