PostgreSQL跨库操作Oracle利器-Oracle_fdw

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
img_e50e15797b9b47c570049e0575bce7f2.png
错误截图1.png

都证明ORACLE_HOME没指定或没有正确配置,需检查环境变量及其文件对应是否正确。

二 创建oracle_fdw扩展

postgres=# create extension oracle_fdw;
CREATE EXTENSION

代表创建成功,如果遇到下面这个问题:

postgres=# create extension oracle_fdw;
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目录中发现是存在的,如下图:

img_8657a3d4d0941a6096430471996dfd60.png
ORACLE_HOME.png

因此需要手动建立一下软连接:

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错误

img_eb48da9e472c475b7d118b64cd327b7a.png
OCIEnvCreate错误.png

解决方法:

  • 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


    img_553905f3caa77394ac00e7661628e8ab.png
    环境变量.png
  • 3 postgres用户下检查oracle_fdw.so的执行权限:


    img_f2033c6b072b095fbf9cd88126cb4553.png
    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设置问题。
img_0ddbff33226dca2f94cce03e49a32b86.png
可能遇到的错误.png

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


img_6fdc3cfb9923ab08de91b403f9e20eb9.png
image.png

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

保存退出即可解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值