本帖最后由 郑全 于 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
之后,即不再报错。
|