(转)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中。

  1.  
    cd /opt/oracle
  2.  
    unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
  3.  
    unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
  4.  
    mv instantclient_12_2 instantclient
  5.  
    cd instantclient
  6.  
    #建立一下软连接
  7.  
    ln -s libclntsh.so.12.1 libclntsh.so
  8.  
    #设置环境变量
  9.  
    vi /etc/profile
  10.  
    #边界内容如下:
  11.  
    #oracle_home一定要写,否则编译会报错
  12.  
    export ORACLE_HOME=/opt/oracle/instantclient
  13.  
    export OCI_LIB_DIR=$ORACLE_HOME
  14.  
    export OCI_INC_DIR=$ORACLE_HOME/sdk/include
  15.  
    #保存退出
  16.  
    #重启用profile文件
  17.  
    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

  1.  
    [root@bogon opt]# cd oracle_fdw-1.5.0
  2.  
    #编译
  3.  
    [root@bogon oracle_fdw-1.5.0]# make
  4.  
    #安装
  5.  
    [root@bogon oracle_fdw-1.5.0]# make install

没报错的话,代表安装成功了,有时候会报一找不到.h头文件的错误,比如:

  1.  
    fatal err:oci.h:No such file or directory
  2.  
    #或者
  3.  
    fatal err:stdio.h:No such file or directory
 
img_e50e15797b9b47c570049e0575bce7f2.png
错误截图1.png

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

二 创建oracle_fdw扩展

  1.  
    postgres=# create extension oracle_fdw;
  2.  
    CREATE EXTENSION

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

  1.  
    postgres=# create extension oracle_fdw;
  2.  
    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的依赖:

  1.  
    [postgres@localhost lib]$ ldd oracle_fdw.so
  2.  
    linux-vdso.so.1 => (0x00007fff5973b000)
  3.  
    libclntsh.so.12.1 => not found
  4.  
    libc.so.6 => /lib64/libc.so.6 (0x00007fa9c8185000)
  5.  
    libmql1.so => not found
  6.  
    libipc1.so => not found
  7.  
    libnnz12.so => not found
  8.  
    libons.so => not found
  9.  
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fa9c7f6d000)
  10.  
    libm.so.6 => /lib64/libm.so.6 (0x00007fa9c7c6b000)
  11.  
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa9c7a4f000)
  12.  
    libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fa9c7835000)
  13.  
    librt.so.1 => /lib64/librt.so.1 (0x00007fa9c762d000)
  14.  
    libaio.so.1 => /lib64/libaio.so.1 (0x00007fa9c742b000)
  15.  
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa9c7210000)
  16.  
    /lib64/ld-linux-x86-64.so.2 (0x00007fa9cc20e000)
  17.  
    libclntshcore.so.12.1 => not found
  18.  
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa9c6ffa000)
  19.  
     

对于这些not found的so文件,我们在ORACLE_HOME目录中发现是存在的,如下图:

 
img_8657a3d4d0941a6096430471996dfd60.png
ORACLE_HOME.png

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

  1.  
    ln -s /opt/oracle/instantclient/libclntsh.so.12.1 /home/postgres/lib/libclntsh.so.12.1
  2.  
    ln -s /opt/oracle/instantclient/libmql1.so /home/postgres/lib/libmql1.so
  3.  
    ln -s /opt/oracle/instantclient/libipc1.so /home/postgres/lib/libipc1.so
  4.  
    ln -s /opt/oracle/instantclient/libnnz12.so /home/postgres/lib/libnnz12.so
  5.  
    ln -s /opt/oracle/instantclient/libons.so /home/postgres/lib/libons.so
  6.  
    ln -s /opt/oracle/instantclient/libclntshcore.so.12.1 /home/postgres/lib/libclntshcore.so.12.1

再次创建oracle_fdw:

 
  1.  
    postgres=# create extension oracle_fdw;
  2.  
    CREATE EXTENSION

应该就能创建成功了。

三 使用oracle_fdw

  1.  
    postgres=# create server oradb_215 foreign data wrapper oracle_fdw options(dbserver '10.144.15.215:1521/mcsas');
  2.  
    postgres=# grant usage on foreign server oradb_215 to postgres;
  3.  
    postgres=# create user mapping for postgres server oradb_215 options(user 'MG_APP',password 'QWERasdf');
  4.  
    postgres=# create foreign table ZWGK_SJJC_FBYJ_GTSJHD123
  5.  
    (
  6.  
    OBJ_ID VARCHAR(42) not null,
  7.  
    XLMC VARCHAR(50),
  8.  
    DYDJ VARCHAR(50),
  9.  
    GTXH VARCHAR(50),
  10.  
    SJFBHD VARCHAR(50),
  11.  
    SSBQ VARCHAR(50),
  12.  
    BNHD VARCHAR(50),
  13.  
    SSWS VARCHAR(50),
  14.  
    PMSGTID VARCHAR(150),
  15.  
    PMSGTBH VARCHAR(150),
  16.  
    SFCL VARCHAR(150)
  17.  
    ) server oradb_215 options(schema 'MG_APP',table 'ZWGK_SJJC_FBYJ_GTSJHD');
  18.  
    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

保存退出即可解决问题。

技术链接
原文地址:https://www.cnblogs.com/liujiacai/p/14582257.html