前言 从 Oracle 无法直接访问 Mysql 数据库,需要配置透明网关后通过 DBLink 实现访问。
今天搞了一下午透明网关配置,流程比较复杂,并且有一些坑,这不立刻来给大家排排坑,说不定以后就用的着呢!
废话不多说,直接实战走起~
一、环境准备 本次环境准备了 3 台主机,分别是 Oracle 数据库,MySQL 数据库,透明网关。
❤️ Oracle 安装包合集和补丁下载地址:2021年Oracle第三季度补丁合集
环境信息:
用途
主机名
IP地址
主机版本
数据库版本
DB名称
端口号
Oracle 数据库
orcl
10.211.55.100
RHEL7.6
11GR2
orcl
1521
MySQL 数据库
mysql
10.211.55.101
RHEL7.6
8.0.26
lucifer
3306
透明网关主机
gateway
10.211.55.102
RHEL7.6
11GR2
无
1521
为什么透明网关需要单独配置一台主机?
不影响数据库主机的正常运行
便于安装配置以及管理
数据库迁移时不需要重新配置透明网关
RAC 环境下,无需重复安装配置多个节点
📢 注意: 透明网关主机的配置不需要很高,无需安装 Oracle 数据库,仅安装透明网关即可!
二、实战演示 1、介质装备 首先,需要下载 GateWay 和 MySQL ODBC安装包:
mysql-connector-odbc-8.0.27-1.el7.x86_64.rpm
p13390677_112040_Linux-x86-64_5of7.zip
方便大家学习,我直接上传到百度网盘供大家下载:
1 2 3 4 5 6 7 链接: https: 提取码: l062 AI写代码bash
2、安装透明网关 2.1、主机 环境配置 下载上述安装介质并上传透明网关主机:
📢 注意: 安装透明网关之前需要配置环境和创建用户等等,可以参照 Linux 安装单机 Oracle 的环境配置步骤,这里就不再详述了!
使用 Oracle 一键安装脚本配置即可:
1 2 3 4 5 6 7 cd /soft ./OracleShellInstall.sh -i 10.211.55.102 -txh Y AI写代码bash
📢 注意: 由于主机安装时选择了最小化安装,并且安装透明网关需要图形化,因此加上 -txh Y 安装图形化界面!
稍许等待几分钟之后,即可配置完成,由于没有上传 DB 安装包,这个报错是正常!
2.2、正式安装 主机配置完成后,开始安装透明网关:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ## 首先 root 用户下,授权 oracle 访问 /soft 目录 chown -R oracle:oinstall /soft ## 切换到 oracle 用户下su - oracle ## 解压透明网关安装包 unzip -q p13390677_112040_Linux-x86-64_5of7.zip ## 配置 vnc 访问图形化界面 vncserver AI写代码bash
使用 VNC 客户端连接:
开始安装:
确认安装位置:
这里选择 for ODBC 即可:
开始安装,静待结束:
root 用户下执行 root.sh 脚本:
1 2 3 4 5 6 7 /u01/app /oraInventory/orainstRoot.sh /u01/app /oracle/product/11.2.0/db /root.sh AI写代码bash
配置监听:
至此,透明网关安装结束!
2.3、安装 mysql-connector 首先需要安装 unixODBC 依赖,否则报错:
安装 unixODBC 依赖后安装 mysql-connector:
1 2 3 4 5 6 7 yum install -y unixODBC* rpm -ivh mysql-connector-odbc -8.0.27-1.el7.x86_64.rpm AI写代码bash
📢 注意: 透明网关的安装到这里就全都结束了,接下来就是配置部分了。
3、透明网关配置 透明网关安装好之后,自然是需要配置才能使用的。
3.1、配置 odbc.ini odbc.ini 文件用来存放 MySQL 数据库相关信息,默认不存在,root 用户下手动创建即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cat<<EOF>/etc/odbc.ini [lucifer]Description = ODBC for MySQLDriver = /usr/lib64/libmyodbc8w.soServer = 10.211 .55.101 Port = 3306 User = luciferPassword = luciferDatabase = lucifer EOF AI写代码bash * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
配置文件中的配置信息如下:
[lucifer] 可以理解为是一个 SID 名称,可以自定义,后面配置需要用到;
Server 是指 MySQL 数据库主机的 IP 地址;
Port 是指 MySQL 数据库的端口;
User 是指 Oracle 需要访问的用户名;
Password 是指被访问用户的登录密码;
Database 是指需要 MySQL 数据库需要被访问的 DB 名称;
📢 注意: 如果有多个 MySQL 数据库需要配置,则填写多个即可!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [lucifer]Description = ODBC for MySQLDriver = /usr/lib64/libmyodbc8w.soServer = 10.211 .55.101 Port = 3306 User = luciferPassword = luciferDatabase = lucifer [lucifer1]Description = ODBC for MySQLDriver = /usr/lib64/libmyodbc8w.soServer = 10.211 .55.105 Port = 3306 User = lucifer1Password = lucifer1Database = lucifer1 AI写代码bash * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17
3.2、配置 init[SID].ora 切换至 oracle 用户,进入 $ORACLE_HOME/hs/admin 目录下,新建一个 init[SID].ora 文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 cat <<EOF>$ORACLE_HOME /hs/admin/initlucifer.ora ##HS Configuration HS_FDS_CONNECT_INFO = lucifer HS_FDS_TRACE_LEVEL = debug HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so HS_FDS_SUPPORT_STATISTICS=FALSE HS_LANGUAGE=AMERICAN_AMERICA.UTF8 HS_NLS_NCHAR = UCS2 ##ODBC Configurationset ODBCINI=/etc/odbc .ini EOF AI写代码bash
这里 initSID.ora 中的 SID 名称和文件中 HS_FDS_CONNECT_INFO 参数值,就是上一步中我们配置 odbc.ini 文件中的 [lucifer] 名称。
📢 注意: 如果有多个 MySQL 数据库需要配置,则创建多个 init[SID].ora 文件 即可!
3.3、配置监听 oracle 用户下,进入 $TNS_ADMIN 配置 listener.ora 文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cat <<EOF>>$TNS_ADMIN /listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC= (SID_NAME=lucifer) (ORACLE_HOME=/u01/app /oracle/product/11.2.0/db ) (PROGRAM =dg4odbc) ) ) EOF AI写代码bash
📢 注意: 如果有多个 MySQL 数据库需要配置,则写成如下格式!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 cat <<EOF>>$TNS_ADMIN /listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = lucifer) (ORACLE_HOME=/u01/app /oracle/product/11.2.0/db ) (PROGRAM =dg4odbc) ) (SID_DESC = (SID_NAME = lucifer1) (ORACLE_HOME=/u01/app /oracle/product/11.2.0/db ) (PROGRAM =dg4odbc) ) ) EOF AI写代码bash
重启监听:
1 2 3 4 5 6 7 8 9 lsnrctl stop lsnrctl start lsnrctl status AI写代码bash* 1* 2* 3
配置完成之后,测试是否可以连接 MySQL 数据库:
1 2 3 4 5 isql lucifer AI写代码bash* 1
成功连接 MySQL 数据库,至此透明网关配置完成!
4、Oracle 数据库配置 透明网关配置完成后,就只需要配置 Oracle 数据库来连接透明网关。
4.1、配置 TNS 通过配置 TNS 来连接透明网关,进入 TNS 配置文件目录 $TNS_ADMIN 配置 TNS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 cat<<EOF>>$TNS_ADMIN/tnsnames.ora lucifer = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.211.55.102)(PORT = 1521)) ) (CONNECT_ DATA = (SID = lucifer) ) (HS = OK) ) EOF AI写代码bash* 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12
通过 tnsping 测试后,发现访问没有问题!
4.2、配置 DBLink 连接 MySQL 数据库 接下来只需要创建你 DBLink 即可连接 MySQL 数据库:
1 2 3 4 5 create public database link lucifer connect to "lucifer" identified by "lucifer" using 'lucifer' ; AI写代码sql * 1
测试连接操作 MySQL 数据库:
1 2 3 4 5 6 7 select * from "lucifer"@lucifer order by "id";delete from "lucifer"@lucifer where "id"= 1 ; AI写代码sql * 1 * 2
至此,整个 Oracle 配置透明网关访问 MySQL 就完成了!
三、最后总结 如果按照我的步骤来操作,整个流程走下来应该会比较顺畅,下面罗列一下我操作过程中遇到的一些报错:
1、init[sid].ora 配置文件的 HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so 不正确,应该是 ODBC 的 Lib包:
1 2 3 4 5 6 7 8 9 ERROR at line 1: ORA-28500 : connection from ORACLE to a non-Oracle system returned this message: ORA-02063 : preceding line from DLK AI写代码bash * 1 * 2 * 3
2、init[sid].ora 里配置的 HS_LANGUAGE=AMERICAN_AMERICA.zhs16gbk 字符集不正确或者没有配置,应该是 Oracle 数据库字符集:
1 2 3 4 5 6 7 8 9 ERROR at line 1: ORA-28500 : connection from ORACLE to a non-Oracle system returned this message:[ AI写代码bash * 1 * 2 * 3
3、执行查询操作时,表名需要带双引号,因为 MySQL 默认表名是区分大小写,而 Oracle 是不区分大小写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 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 AI写代码bash
4、Oracle 数据库配置 TNS 时,没有加 (HS = OK):
1 2 3 4 5 6 7 8 9 ERROR at line 1: ORA-28546 : connection initialization failed, probable Net8 admin error ORA-02063 : preceding line from LUCIFER AI写代码bash * 1 * 2 * 3
本文部分内容参考文档:Oracle透明网关访问MySQL数据库