(转)PostgreSQL跨库操作Oracle利器-Oracle_fdw
原文:https://www.pianshen.com/article/8800373638/
Oracle_fdw是PG的一个外部数据接口,可以使PostgreSQL轻松跨库操作Oracle。Oracle_fdw的作用有以下两点:
- PG可以跨库增删改查Oracle中的表,可以查询Oracle的视图,可以使PG中的表和Oracle中表/视图作Join查询,类似dblink的功能。
- 快速将Oralce表迁移进入PostgreSQL。
本文简单介绍下Oracle_fdw的安装和使用。
一 Oracle_fdw安装
官方地址:http://pgxn.org/dist/oracle_fdw/ ,选择一个版本下载。
1.1 安装Oracle Instant Client
从oralce官网下载 'Basic' and 'SDK',假如下载后文件所在位置在/opt/oracle中。
-
cd /opt/oracle
-
unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
-
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
-
mv instantclient_12_2 instantclient
-
cd instantclient
-
#建立一下软连接
-
ln -s libclntsh.so.12.1 libclntsh.so
-
#设置环境变量
-
vi /etc/profile
-
#边界内容如下:
-
#oracle_home一定要写,否则编译会报错
-
export ORACLE_HOME=/opt/oracle/instantclient
-
export OCI_LIB_DIR=$ORACLE_HOME
-
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
-
#保存退出
-
#重启用profile文件
-
source /etc/profile
1.2 编译oracle_fdw
启用postgres用户环境变量
[root@bogon opt]# source /home/postgres/.bashrc
解压oracle_fdw
[root@bogon opt]# unzip oracle_fdw-1.5.0.zip
编译安装oracle_fdw
-
[root@bogon opt]# cd oracle_fdw-1.5.0
-
#编译
-
[root@bogon oracle_fdw-1.5.0]# make
-
#安装
-
[root@bogon oracle_fdw-1.5.0]# make install
没报错的话,代表安装成功了,有时候会报一找不到.h头文件的错误,比如:
-
fatal err:oci.h:No such file or directory
-
#或者
-
fatal err:stdio.h:No such file or directory

都证明ORACLE_HOME没指定或没有正确配置,需检查环境变量及其文件对应是否正确。
二 创建oracle_fdw扩展
-
postgres=# create extension oracle_fdw;
-
CREATE EXTENSION
代表创建成功,如果遇到下面这个问题:
-
postgres=
-
ERROR: could not load library "/home/postgres/lib/oracle_fdw.so": libclntsh.so: cannot open shared object file: No such file or directory
是缺少so文件了,有时候编译成功了,还是会缺不少文件,用ldd查看下oracle_fdw.so的依赖:
-
[postgres@localhost lib]$ ldd oracle_fdw.so
-
linux-vdso.so.1 => (0x00007fff5973b000)
-
libclntsh.so.12.1 => not found
-
libc.so.6 => /lib64/libc.so.6 (0x00007fa9c8185000)
-
libmql1.so => not found
-
libipc1.so => not found
-
libnnz12.so => not found
-
libons.so => not found
-
libdl.so.2 => /lib64/libdl.so.2 (0x00007fa9c7f6d000)
-
libm.so.6 => /lib64/libm.so.6 (0x00007fa9c7c6b000)
-
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa9c7a4f000)
-
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fa9c7835000)
-
librt.so.1 => /lib64/librt.so.1 (0x00007fa9c762d000)
-
libaio.so.1 => /lib64/libaio.so.1 (0x00007fa9c742b000)
-
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa9c7210000)
-
/lib64/ld-linux-x86-64.so.2 (0x00007fa9cc20e000)
-
libclntshcore.so.12.1 => not found
-
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa9c6ffa000)
-
对于这些not found的so文件,我们在ORACLE_HOME目录中发现是存在的,如下图:

因此需要手动建立一下软连接:
-
ln -s /opt/oracle/instantclient/libclntsh.so.12.1 /home/postgres/lib/libclntsh.so.12.1
-
ln -s /opt/oracle/instantclient/libmql1.so /home/postgres/lib/libmql1.so
-
ln -s /opt/oracle/instantclient/libipc1.so /home/postgres/lib/libipc1.so
-
ln -s /opt/oracle/instantclient/libnnz12.so /home/postgres/lib/libnnz12.so
-
ln -s /opt/oracle/instantclient/libons.so /home/postgres/lib/libons.so
-
ln -s /opt/oracle/instantclient/libclntshcore.so.12.1 /home/postgres/lib/libclntshcore.so.12.1
再次创建oracle_fdw:
-
postgres=# create extension oracle_fdw;
-
CREATE EXTENSION
应该就能创建成功了。
三 使用oracle_fdw
-
postgres=# create server oradb_215 foreign data wrapper oracle_fdw options(dbserver '10.144.15.215:1521/mcsas');
-
postgres=# grant usage on foreign server oradb_215 to postgres;
-
postgres=# create user mapping for postgres server oradb_215 options(user 'MG_APP',password 'QWERasdf');
-
postgres=# create foreign table ZWGK_SJJC_FBYJ_GTSJHD123
-
(
-
OBJ_ID VARCHAR(42) not null,
-
XLMC VARCHAR(50),
-
DYDJ VARCHAR(50),
-
GTXH VARCHAR(50),
-
SJFBHD VARCHAR(50),
-
SSBQ VARCHAR(50),
-
BNHD VARCHAR(50),
-
SSWS VARCHAR(50),
-
PMSGTID VARCHAR(150),
-
PMSGTBH VARCHAR(150),
-
SFCL VARCHAR(150)
-
) server oradb_215 options(schema 'MG_APP',table 'ZWGK_SJJC_FBYJ_GTSJHD');
-
postgres=# select * from ZWGK_SJJC_FBYJ_GTSJHD123 limit 10;
这样,将oracle中MG_APP.ZWGK_SJJC_FBYJ_GTSJHD表“映射”到pg了,可以查询了。
四 可能遇到的错误
4.1 OCIEnvCreate错误

解决方法:
-
1 检查 /etc/profile中ORACLE_HOME配置及其
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH -
2 检查home/postgres/.bashrc也有:
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
环境变量.png -
3 postgres用户下检查oracle_fdw.so的执行权限:
image.png
Xshell下是绿色的,要是灰色,就 chmod 777 $PGHOME/lib/oracle_fdw.so
-
4 全部检查完毕后一定要重启pg服务。
4.2 client host name is not set
有时候报错:ORA-24454: client host name is not set,这属于非主流错误,原因是本机的hosts设置问题。

编辑对应服务器的hosts文件:

Root@后面的是服务器的名称,所以如下配置:

保存退出即可解决问题。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战