zoukankan      html  css  js  c++  java
  • (转)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

    保存退出即可解决问题。

    技术链接
  • 相关阅读:
    Two Sum
    Longest Common String
    Maximum Subarray
    Copy List with Random Pointer
    Convert Binary Search Tree to Doubly Linked List
    Fast Power
    Centos7安装ELK Cyrus
    IPv6实验 OSPFv3
    IPv6笔记和实验 RIPng
    IPv6 ICMPv6笔记
  • 原文地址:https://www.cnblogs.com/liujiacai/p/14582257.html
Copyright © 2011-2022 走看看