需求:在Oracle上查询MySQL的数据 实现:Oracle数据网关功能(参考文档https://docs.oracle.com/database/121/ODBCU/intro.htm#ODBCU705) 原理: Oracle 数据库网关提供了从 Oracle 环境透明访问驻留在非 Oracle 系统中的数据的能力。这种透明性消除了应用程序开发人员自定义其应用程序以访问来自不同非 Oracle 系统的数据的需要,从而减少了开发工作并增加了应用程序的移动性。可以使用一致的 Oracle 接口为 Oracle 和非 Oracle 系统开发应用程序。 网关技术由两部分组成:具有连接到非 Oracle 系统的通用技术的组件,所有非 Oracle 系统通用,称为异构服务,以及特定于非 Oracle 系统的组件网关连接到的系统。异构服务与 Oracle 数据库网关相结合,支持从 Oracle 环境透明访问非 Oracle 系统。其原理图如下: image.png 从上图可知,Oracle连接MySQL需要涉及到如下组件:DG4ODBC, ODBC Driver Manager, ODBC Driver,本文介绍如何配置运行起来。 系统版本信息: Oracle: 11.2.0.1.0 OS: RedHat 7.6 MySQL: 5.7.29 OS: CentOS 8.3


步骤1.确认数据库网关是32位还是64位

$ file $ORACLE_HOME/bin/dg4odbc
/u01/app/oracle/product/11.2.0/dbhome_1/bin/dg4odbc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a795fd086e08cac1989af3f7a9f4c10c9479afe6, not stripped
可见为64位

步骤2.下载并安装ODBC Driver Manager

$ cd /u01/app
$ wget http://sourceforge.net/projects/unixodbc/files/unixODBC/2.2.14/unixODBC-2.2.14-linux-x86-64.tar.gz
$ tar zxvf unixODBC-2.2.14-linux-x86-64.tar.gz
$ mkdir unixodbc-2.2.14
$ mv usr ./unixodbc-2.2.14

步骤3.下载并安装ODBC Driver for MySQL 下载对应的安装包(https://dev.mysql.com/downloads/connector/odbc/5.2.html#downloads)

# cd /opt
# rz mysql-connector-odbc-8.0.25-1.el7.x86_64.rpm
# rpm -ivh mysql-connector-odbc-8.0.25-1.el7.x86_64.rpm

步骤4.配置ODBC Driver 在/etc目录下创建odbc.ini如下:

[test]
Description=stock trade database
Driver= MySQL ODBC 8.0 Unicode Driver  (需要和/etc/odbcinst.ini 中的名称对应,不然会出现找不到库)
SERVER=10.10.10.10
PORT=3306
User = root
Password = 123456
Database = test  (注意大小写)
OPTION = 0
TRACE = OFF

步骤5.基础文件配置

# yum install readline-devel readline
# ln -s /usr/lib64/libreadline.so.6  /usr/lib64/libreadline.so.5

步骤6.验证ODBC连接

$ export ODBCINI=/etc/odbc.ini
$ export LD_LIBRARY_PATH=/u01/app/unixodbc-2.2.14/usr/local/lib:$LD_LIBRARY_PATH
$ cd /u01/app/unixodbc-2.2.14/usr/bin
$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
$ ./isql test -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

代表已成功 步骤7.配置tnsname.ora,添加配置(我的路径:$ORACLE_HOME/network/admin/tnsnames.ora)

TEST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521))
    (CONNECT_DATA =
      (SID = test))
      (HS = OK)
  )

配置注释: f3302bf5748ea2603f877ddfa5f723f1_09d7ec8fa11c9dea79417e4756b708d496e221fa.png 1f3d493fe0b29348048469ce81038370_ab37f43ade7c6d0c084cf68b3168651082ad01f6.png 步骤8.配置listener.ora,添加配置(我的路径:$ORACLE_HOME/network/admin/listener.ora)

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
	(SID_NAME = test)
	(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
	(PROGRAM = dg4odbc)
	(ENVS = LD_LIBRARY_PATH = /u01/app/unixodbc-2.2.14/usr/local/lib:/u01/app/oracle/product/11.2.0/dbhome_1/lib)
    )
  )

配置注释: 7dfdf9f4b3f765e53ff78c39674a9cb8_02c661626fdb005dfc5dcceff68caffd7c6235d7.png 步骤9.配置ODBC监听

$ cd $ORACLE_HOME/hs/admin
$ vi inittest.ora (init后面的内容需要和上面的sid_name一致)
文件内容
## which describes the connection to the non-Oracle system.参照/etc/odbc.ini
HS_FDS_CONNECT_INFO=test   
## Specifies the full path name to the ODBC driver manager.
HS_FDS_SHAREABLE_NAME=/u01/app/unixodbc-2.2.14/usr/local/lib/libodbc.so
## 支持数据统计
HS_FDS_SUPPORT_STATISTICS=FALSE
#Provides Heterogeneous Services with character set, language, and territory information of the #non-Oracle data source. The value must use the following format:
#language[_territory.character_set]
HS_LANGUAGE="simplified chinese_china.al32utf8"
# 解决unicode字符集因数据库不同而不同
HS_NLS_NCHAR=UCS2
set ODBCINI=/etc/odbc.ini

步骤10.重载配置文件,使配置生效

$ lsnrctl reload
$ lsnrctl status
Service "test" has 1 instance(s).
  Instance "test", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

步骤11.验证配置

$ tnsping test
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 31-8月 -2021 11:21:59
Copyright (c) 1997, 2009, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.11)(PORT = 1521)) (CONNECT_DATA = (SID = test)) (HS = OK))
OK (10 msec)

步骤12.创建dblink

SQL>DROP PUBLIC DATABASE LINK MYSQLLINK;
SQL>CREATE PUBLIC DATABASE LINK MYSQLLINK CONNECT TO "dblink" IDENTIFIED BY <password>
 USING 'test';

主要mysql有严格的大小写 步骤13.验证

SQL> select 1 from dual@MYSQLLINK;

	 1
----------
	 1


其他参考链接: https://blog.csdn.net/weixin_34026276/article/details/89559311?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.essearch_pc_relevant&spm=1001.2101.3001.4242 https://blog.csdn.net/dbanote/article/details/10488581