Oracle通过透明网关以DBLINK形式连接MogDB的方法

2024年 6月 6日 59.9k 0

Oracle透明网关是Oracle公司的一个连接访问异构数据库的组件。通过透明网关,Oracle可以以数据库链接(dblink)的方式连接异构数据库。

目前,通过Oracle Database Gateway for ODBC,可以实现在Oracle数据库中直接访问MogDB数据库。

下面是具体的实现步骤:

1. 下载Oracle透明网关软件

1.1   登录 https://edelivery.oracle.com

1.2   搜索 database gateway

Oracle通过透明网关以DBLINK形式连接MogDB的方法-1

1.3   选择合适版本

1.4   选择Continue

Oracle通过透明网关以DBLINK形式连接MogDB的方法-2

1.5   选择合适操作系统平台

开始下载

2. 安装Oracle透明网关软件

不同版本界面可能不一样

解压,并运行 ./runInstaller

关键步骤在于选择 Oracle Database Gateway for ODBC

Oracle通过透明网关以DBLINK形式连接MogDB的方法-3

完成安装

3. 安装unixODBC

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

4, 下载Opengauss ODBC驱动和libpq驱动

https://opengauss.org/zh/download.html

Oracle通过透明网关以DBLINK形式连接MogDB的方法-4

并一起解压到$ORACLE_HOME/hs/ogodbc下(或者其他地方也可以的)。

5. 配置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。

6. 配置 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 为目标库相应信息

7. 配置 hs/admin/init.ora

cd $ORACLE_HOME/hs/admin

vi init.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 有时候连接失败需要设置这个参数,应该是字符集不匹配时。

8. 启动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正常工作,还未和远程数据库发生关系。

9. 创建DBLINK

Create database link mogdb_link connect to “user” identified by “pass” using ‘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中使用字段名称小写+双引号的方式,如果实在不想改应用代码,可联系恩墨工程师进行定制化调整。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论