美文网首页开源GIS文章集PostgreSQL
PostgreSQL跨库操作Oracle利器-Oracle_fd

PostgreSQL跨库操作Oracle利器-Oracle_fd

作者: 遥想公瑾当年 | 来源:发表于2017-01-20 15:46 被阅读972次

    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
    
    错误截图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目录中发现是存在的,如下图:

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

    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


      环境变量.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设置问题。 可能遇到的错误.png

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


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

    保存退出即可解决问题。

    相关文章

      网友评论

      本文标题:PostgreSQL跨库操作Oracle利器-Oracle_fd

      本文链接:https://www.haomeiwen.com/subject/uugwbttx.html