暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

循序渐进丨Oracle 通过透明网关以dblink形式连接 MogDB 的方法

MogDB 2024-06-06
96

Oracle 透明网关是 Oracle 公司的一个连接访问异构数据库的组件。通过透明网关,Oracle 可以以数据库链接(dblink)的方式连接异构数据库。
目前,通过 Oracle Database Gateway for ODBC,可以实现在 Oracle 数据库中直接访问 MogDB 数据库。
下面是具体的实现步骤:

01

下载 Oracle 透明网关软件

登录 https://edelivery.oracle.com,搜索 database gateway:

选择合适版本,点击Continue:
选择合适操作系统平台,开始下载。

02

安装Oracle透明网关软件

不同版本界面可能不一样,解压,并运行 ./runInstaller,关键步骤在于选择 Oracle Database Gateway for ODBC:
完成安装。

03

安装unixODBC

root用户直接运行:
yum install unixODBC unixODBC-devel

04

下载 openGauss ODBC驱动和libpq驱动

https://opengauss.org/zh/download/
并一起解压到$ORACLE_HOME/hs/ogodbc下(或者其他地方也可以)。

05

配置Oracle LISTENER/TNSNAME

    cd $ORACLE_HOME/network/admin
    n  listener.ora
    LISTENER_HS =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1567))
        )
      )
    SID_LIST_LISTENER_HS=
      (SID_LIST=
          (SID_DESC=
             (SID_NAME=mogdb)
             (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
             (ENV="LD_LIBRARY_PATH=/u01/app/oracle/product/19c/dbhome_1/hs/odbc")
             (PROGRAM=dg4odbc)
          )
          (SID_DESC=
             (SID_NAME=mogdb2)
             (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
             (ENV="LD_LIBRARY_PATH=/u01/app/oracle/product/19c/dbhome_1/hs/odbc ")
             (PROGRAM=dg4odbc)
          )
      )
    其中:
    • LISTENER_HS为监听名字,可随意选择
    • 1567为端口号,可随意选择,不重复即可
    • mogdb/mogdb2为透明网关SID, 理论上可随意选择(不超过8位,不以数字开头)
    • /u01/app/oracle/product/19c/dbhome_1 为ORACLE_HOME,根据实际情况做相应改动即可
    可支持一个监听负责多个数据库,通过多个SID_DESC实现;
    也可以把SID_DESC加到现有的LISTENER当中,实现默认LISTENER同时监听普通连接和透明网关连接。
      n  tnsnames.ora
      mogdbtns =
        (DESCRIPTION=
          (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1567))
          (CONNECT_DATA=(SID=mogdb))
          (HS=OK)
        )
      Mogdb2tns =
        (DESCRIPTION=
          (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1567))
          (CONNECT_DATA=(SID=mogdb2))
          (HS=OK)
        )
      其中:
      • mogdbtns为TNS名字,可随意选择
      • 1567为端口号,对应listener内容
      • mogdb为透明网关SID, 对应listener内容
      如果连接多个数据库,则需要建立多个tnsname。

      06

      配置 ODBC.ini

      目录和文件名其实可任选,为了方便管理,建议$ORACLE_HOME/hs/admin:
        cd $ORACLE_HOME/hs/admin
        vi odbc.ini
        [MOGDB]
        Servername=192.168.2.131
        Port=10086
        Database=postgres
        Driver=/u01/app/oracle/product/19c/dbhome_1/hs/odbc/psqlodbcw.so
        Username=tpcc
        Password=tpcc@123
        [MOGDB2]
        Servername=192.168.2.131
        Port=10199
        Database=postgres
        Driver=/u01/app/oracle/product/19c/dbhome_1/hs/odbc/psqlodbcw.so
        Username=tpcc
        Password=tpcc@123
        其中:
        • MOGDB/MOGDB2为ODBC的数据源名称,可任选
        • Driver为ODBC驱动解压目录下的psqlodbcw.so
        • Servername/Port/ Database/ Username/Password 为目标库相应信息

        07

        配置 hs/admin/init.ora

          cd $ORACLE_HOME/hs/admin
          vi init<SID>.ora
          此处SID对应listerner.ora里面的 SID_NAME的定义,如果多个SID_NAME,则需要多份init.ora;
          最核心的几个参数:
            HS_FDS_CONNECT_INFO = MOGDB
            set ODBCINI = /home/oracle/.odbc.ini
            HS_FDS_SHAREABLE_NAME = /home/oracle/ogodbc/lib/psqlodbcw.so
            HS_FDS_QUOTE_IDENTIFIER = FALSE
            set LowerCaseIdentifier = on
            HS_FDS_TRACE_LEVEL = 1
            HS_NLS_NCHAR = UCS2  
            其中:
            • HS_FDS_CONNECT_INFO 对应 odbc.ini 里面的数据源名字
            • ODBCINI 对应上一步odbc.ini的完整路径及文件名
            • HS_FDS_SHAREABLE_NAME 对应odbc.ini的驱动文件
            • HS_FDS_QUOTE_IDENTIFIER = FALSE 解决字段名大小写问题
            • set LowerCaseIdentifier = on 解决字段名大小写问题
            • HS_FDS_TRACE_LEVEL 开始时可以设置大一点,方便Debug, 比如255, 稳定下来可以改为0或者1。
            • HS_NLS_NCHAR = UCS2 有时候连接失败需要设置这个参数,应该是字符集不匹配时。

            08


            启动listener并简单测试

              lsnrctl start LISTENER_HS
              名字对应listener里的名字:
                tnsping mogdb
                Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1567)) (CONNECT_DATA = (SERVER = DEDICATED) (SID_NAME = mogdb) (SERVICE_NAME = mogdb)) (HS=OK))
                OK (10 msec)
                注意,此处的OK 仅代表LISTENER正常工作,还未和远程数据库发生关系。

                09

                创建dblink

                Create database link mogdb_link connect to useridentified by passusing mogdb;
                • mogdb_link是dblink名字
                • ‘mogdb’对应tnsnames.ora里的内容
                • 注意前面的user和pass加双引号,using后面的mogdb加单引号

                10

                测试dblink

                  Select * from pg_class@mogdb_link;
                  select “relname” from pg_class@mogdb;
                  目前字段名称需要加括号,暂无合适的绕过方法;
                  如果可以,建议修改应用,涉及远程表的部分SQL中使用字段名称小写+双引号的方式,如果实在不想改应用代码,可联系云和恩墨的工程师进行定制化调整。

                  11

                  遗留问题

                  • 如果语句报错,后面的访问也会报错
                  需要显式rollback 或者断开会话重连。
                  odbc.ini里面设置ForExtensionConnector=1可能可以解决这个问题,还需要进一步测试验证。
                  • 表名大小写问题
                  访问 MogDB 的表的指定字段需要使用小写并加双引号。
                  如果可以,建议修改应用,涉及远程表的部分SQL中使用字段名称小写+双引号的方式,如果实在不想改应用代码,可联系云和恩墨的工程师进行定制化调整。


                  关于作者

                  罗海雄,数据库研发架构师,性能优化专家,2012 ITPUB 全国SQL大赛冠军。超十年企业级系统设计与优化经验,资深架构师与优化大师,对SQL优化理解尤其深入。曾服务于甲骨文公司。

                  END


                  MogDB 是云和恩墨基于 openGauss 开源内核进行增强提升,推出的一款安稳易用的企业级关系型数据库。其具备金融级高可用和全密态计算的极致安全、面向多核处理器的极致性能、AI自诊断调优的极致智能能力,能够满足从核心交易到复杂计算的企业级业务需求。

                  访问官网了解更多:www.mogdb.io

                  产品兼容适配申请:partner@enmotech.com

                  进入交流群:Roger_database

                  文章转载自MogDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论