Oracle透明网关访问MySQL数据库

针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数据库dblink访问。

Linux Oracle已被广泛应用但是也在不断的更新,这里介绍Linux
Oracle装设置使用,帮助大家安装更新Linux Oracle系统前一阵在公司通过Linux
Oracle访问MySQL,测试环境:CentOS5_X64, Oracle10g_X64, MySQL5
。把一些经验分享给大家!

好久没做透明网关的配置了,最近有业务需求,这里将部署过程做个记录,希望对有需要的朋友有所帮助。

1, 首先在Linux
Oracle所在计算机安装MySQL的Client端软件,并且x86_64和i386版本的都需要安装,以便可以连接MySQL数据库。查看Client安装情况:
rpm -qa |grep mysql
mysql-5.0.45-7.el5
mysql-5.0.45-7.el5
得到两条记录,一条是x86_64的,一条是i386的。

一、Oracle数据库通过透明网关访问MySQL数据库环境说明

如果看到还没有安装mysql客户端软件,则需要安装:
yum install mysql
yum install mysql.i386
验证在此Linux Oracle所在计算机是可以连接目标主机MySQL数据库:
mysql -h 192.168.1.1 -u root -p mysql

RHEL6.6  oracle 11.2.0.4

2, 检查Linux Oracle所在计算机是否已安装MySQL
ODBC客户端,并且x86_64和i386版本的都需要安装。 rpm -qa |grep
mysql-connect
如果没有安装mysql-connector-odbc,则用下面命令下载和安装:下载
mysql-connector-odbc:wget
ftp://mirror.switch.ch/pool/3/mirror/centos/5.2/os/i386/CentO
S/mysql-connector-odbc-3.51.12-2.2.i386.rpm 安装mysql-connector-odbc:
rpm -ivh mysql-connector-odbc-3.51.12-2.2.i386.rpm 得到提示 libltdl.so.3
is needed by mysql-connector-odbc-3.51.12-2.2.i386
,发现需要安装libtool的i386版本,因此通过如下命令安装libtool-ltdl.i386:
yum list *.i386|grep libtool
yum install libtool-ltdl.i386

RHEL6.6 MySQL5.7

3, 在Linux Oracle所在计算机编辑/etc/odbc.ini文件,测试ODBC工作vi
/etc/odbc.ini #odbc.ini内容如下

odbc

[test]   Driver=/usr/lib64/libmyodbc3.so   Description=MySQL   Server=192.168.1.1(MySQL Server IP)   Port=3306   User= (MySQL Username)  UID= (MySQL Username)  Password= (MySQL PWD)  Database= (MySQL Database Name)  Option=3   Socket=  

二、数据访问流程

在命令行中执行下列命令,应能够顺利登入MySQL
Client窗口,即证明ODBC功能正常: isql -v testquit

oracle——dg4odbc——odbc——mysql

4, 编辑hs配置文件 vi
/ora10g/hs/admin/inittest.ora(注意文件名中蓝色部分为odbc.ini中蓝色名称)

三、Oracle透明网关(MySQL)安装

HS_FDS_CONNECT_INFO = test HS_FDS_TRACE_LEVEL = on正式使用后,不需要排错的时候应设为off)   HS_FDS_TRACE_FILE_NAME = test.trc   HS_FDS_SHAREABLE_NAME=/usr/lib/libmyodbc3.so   set ODBCINI=/etc/odbc.ini  

oracle 11.2.0.4默认安装了odbc透明网关
验证:
[oracle@test ~]$ cd $ORACLE_HOME/hs
[oracle@test hs]$ dg4odbc

5, 编辑Linux Oracle所在计算机的Oracle
listener的配置文件,建立一个模拟Oracle
Listener的监听方式,为将来建立dblink做准备: vi
/ora10g/network/admin/listener.ora 加入如下语句:

Oracle Corporation --- FRIDAY    APR 27 2018 10:07:44.375

Heterogeneous Agent Release 11.2.0.4.0 - 64bit Production  Built with
   Oracle Database Gateway for ODBC
(SID_DESC =  (SID_NAME = test)   (ORACLE_HOME = /ora10g)   (PROGRAM = hsodbc)   (ENVS=LD_LIBRARY_PATH=/ora10g/lib32:/usr/lib64:/ora10g/lib)  

##database gateway for odbc  简称   dg4odbc 

listener.ora文件现在的内容变成:

四、mysql-connector安装

SID_LIST_LISTENER = (  SID_LIST =   (SID_DESC =   (ORACLE_HOME = /ora10g)   (PROGRAM = extproc)   (GLOBAL_DBNAME=prod)   (SID_NAME=prod)   (SID_DESC =   (SID_NAME = test)   (ORACLE_HOME = /ora10g)   (PROGRAM = hsodbc)   (ENVS=LD_LIBRARY_PATH=/ora10g/lib32:/usr/lib64:/ora10g/lib)   LISTENER =   (DESCRIPTION_LIST =   (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)  (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521) 

下载:

执行lsnrctl reload使Listener生效:

安装:

su – oracle   lsnrctl reload   LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 09-FEB-2009 13:59:38 Copyright (c) 1991, 2007, Oracle.   All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))   The command completed successfully   lsnrctl status   LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 12-FEB-2009 08:56:00  Copyright (c) 1991, 2007, Oracle.All rights reserved.  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))  STATUS of the LISTENER  AliasLISTENER  Version TNSLSNR for Linux: Version 10.2.0.4.0 - Production  Start Date 03-JAN-2009 03:47:39  Uptime40 days 5 hr. 8 min. 20 sec  Trace Leveloff  SecurityON: Local OS Authentication  SNMP OFF  Listener Parameter File/ora10g/network/admin/listener.ora  Listener Log File/ora10g/network/log/listener.log  Listening Endpoints Summary...  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))  Services Summary...  Service "PLSExtProc" has 1 instance(s).  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...  Service "test" has 1 instance(s).  Instance "test", status UNKNOWN, has 1 handler(s) for this service...  The command completed successfully 
[root@test ~]# rpm -ivh mysql-connector-odbc-8.0.11-1.el6.x86_64.rpm
warning: mysql-connector-odbc-8.0.11-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...                ########################################### [100%]
   1:mysql-connector-odbc   ########################################### [100%]
Success: Usage count is 1
Success: Usage count is 1

6, 编辑Linux
Oracle所在计算机中的tnsnames.ora文件,便于建立dblink。注意,此tnsnames的配置可以支持tnsping,但是不能支持sqlplus登录,只用于dblink:vi
/ora10g/network/admin/tnsnames.ora

依赖包安装:
yum install unixODBC*

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

rpm -qa |grep unixODBC

7, 在Oracle Database建立dblink:

unixODBC-devel-2.2.14-14.el6.x86_64
unixODBC-2.2.14-14.el6.x86_64

create public database link MYSQL   connect to "mysql username" identified by "mysql pwd"   using '(DESCRIPTION =   (ADDRESS = (PROTOCOL = TCP) (HOST = 127.0.0.1) (PORT =1521) )   (CONNECT_DATA = (SID= test) )   (HS=OK) 

五、ODBC配置

要注意用户名和密码处需要用双引号,否则Linux
Oracle所传输的都是大写字母,可能无法登录进入MySQL。

[root@test ~]# vi /etc/odbc.ini

8,
由于MySQL中的表名的大小写敏感,因此需要在进行SQL查询时对表名用双引号扩起来
select * from “tablename”@test

[mysql_test]
Description     = ODBC for MySQL
Driver          = /usr/lib64/libmyodbc8w.so
Server          = mysql_ipaddr
Port            = 3306
User            = dbtest
Password        = abcd1234
Database        = test 
  1. Linux Oracle 10g软件安装数据库
  2. Linux Oracle可以装在WMware虚拟机上
  3. Linux mount命令系统挂载与镜像处理
  4. Linux vmstat进程信息和内存信息
  5. Linux PHP编译生成扩展与修改配置

六、MySQL数据库创建账号、授权并测试连通性

Oracle已被广泛应用但是也在不断的更新,这里介绍Linux
Oracle装设置使用,帮助大家安装更新Linux Oracle系统前一阵在公司通过Linux
Oracle访…

账号创建:
(root:localhost:Fri Apr 27 10:16:11 2018)[(none)]>create database test;
(root:localhost:Fri Apr 27 10:16:22 2018)[(none)]>grant all on test.* to dbtest@'%' identified by 'abcd1234';
(root:localhost:Fri Apr 27 10:16:40 2018)[(none)]>flush privileges;
连通性测试:

[root@test ~]# isql mysql_test    
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 

七、Oracle数据库相关配置

(1)hs透明网关配置

[oracle@test ~]$ cd $ORACLE_HOME/hs
[oracle@test hs]$ cd admin
[oracle@test admin]$ vi initmysql_test.ora

##HS Configuration

HS_FDS_CONNECT_INFO = mysql_test
HS_FDS_TRACE_LEVEL = debug
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_FDS_SUPPORT_STATISTICS=FALSE
HS_LANGUAGE=AMERICAN_AMERICA.zhs16gbk

##ODBC Configuration

set ODBCINI=/etc/odbc.ini

##这里配置的是数据库实例名、odbc
lib包,oracle数据库字符集、odbc配置文件路径

(2)监听配置

[oracle@test admin]$ vi
/U01/app/oracle/product/11.2.0.4/network/admin/listener.ora

SID_LIST_LISTENER =
(SID_LIST =
  (SID_DESC =
  (GLOBAL_DBNAME = dbsid)
  (SID_NAME = dbsid)
  (ORACLE_HOME=/U01/app/oracle/product/11.2.0.4)
  )
  (SID_DESC=
  (SID_NAME=mysql_test)
  (ORACLE_HOME=/U01/app/oracle/product/11.2.0.4)
  (PROGRAM=dg4odbc)
  )
)

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.1)(PORT = 1521))
    )
)

重启监听
lsnrctl stop
lsnrctl start

(3)tnsname配置

必赢365net手机版,配置tnsname
[oracle@test admin]$ vi
/U01/app/oracle/product/11.2.0.4/network/admin/tnsnames.ora

dbsid_mysql =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.1 )(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = mysql_test)
    )
   (HS = OK)
  )

测试tnsname连接
[oracle@test admin]$ tnsping dbsid_mysql

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 27-APR-2018 12:17:58

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.1)(PORT = 1521))) (CONNECT_DATA = (SID = mysql_test)) (HS = OK))
OK (0 msec)

八、dblink创建以及数据访问测试

SQL>create  PUBLIC DATABASE LINK dlk connect to "dbtest" identified by "abcd1234" using 'dbsid_mysql';

SQL> select * from "t1"@dlk;

        id
----------
        10
        11
       
SQL> insert into "t1"@dlk values(30);

1 row created.

九、错误信息以及处理方法

(1)错误01

错误信息:

SQL> select * from t1@dlk;
select * from t1@dlk
                 *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ORA-02063: preceding line from DLK

错误原因以及处理方法:hs/admin/init[sid].ora里配置的HS_FDS_SHAREABLE_NAME
= /usr/lib64/libodbc.so不正确,应该是odbc的Lib包
(2)错误02
错误信息:

SQL> select * from "t1"@dlk;
select * from "t1"@dlk
                   *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[

错误原因以及处理方法:hs/admin/init[sid].ora里配置的HS_LANGUAGE=AMERICAN_AMERICA.zhs16gbk字符集不正确,应该是oracle数据库字符集
(3)错误03:
错误信息:

SQL> select * from t1@dlk;
select * from t1@dlk
*
ERROR at line 1:
ORA-00942: table or view does not exist
[MySQL][ODBC 8.0(w) Driver][mysqld-5.7.18-log]Table 'test.T1' doesn't exist
{42S02,NativeErr = 1146}
ORA-02063: preceding 2 lines from DLK

错误原因以及处理方法:执行的查询操作,表名需要带双引号,因为mysql默认表名是区分大小写,而oracle是不区分大小写的
select * from “t1″@dlk;
(4)参考文档

Leave a Comment.