从 oracle 无法直接访问 mysql 数据库,需要配置透明网关后通过 dblink 实现访问。
今天搞了一下午透明网关配置,流程比较复杂,并且有一些坑,这不立刻来给大家排排坑,说不定以后就用的着呢!
废话不多说,直接实战走起~
本次环境准备了 3 台主机,分别是 oracle 数据库,mysql 数据库,透明网关。
- ⭐️ linux 主机安装教程可参考:实战篇:vmware workstation 虚拟机安装 linux 系统
- ⭐️ oracle 单机安装教程可参考:实战篇:linux 安装 oracle 11gr2 数据库保姆级教程
- ⭐️ oracle rac 安装教程可参考:实战篇:一步步教你 linux 7 安装 oracle 11gr2 rac
- ⭐️ oracle 脚本一键安装可参考:
- ⭐️ mysql 安装教程可参考:实战篇:手把手教你 linux 安装 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
方便大家学习,我直接上传到百度网盘供大家下载:
链接: https://pan.baidu.com/s/1ybjgu1jcbogrbjctqtl9ta 提取码: l062
2、安装透明网关
2.1、主机环境配置
下载上述安装介质并上传透明网关主机:
📢 注意: 安装透明网关之前需要配置环境和创建用户等等,可以参照 linux 安装单机 oracle 的环境配置步骤,这里就不再详述了!
使用 oracle 一键安装脚本配置即可:
cd /soft
./oracleshellinstall.sh -i 10.211.55.102 -txh y
📢 注意: 由于主机安装时选择了最小化安装,并且安装透明网关需要图形化,因此加上 -txh y
安装图形化界面!
稍许等待几分钟之后,即可配置完成,由于没有上传 db 安装包,这个报错是正常!
2.2、正式安装
主机配置完成后,开始安装透明网关:
## 首先 root 用户下,授权 oracle 访问 /soft 目录
chown -r oracle:oinstall /soft
## 切换到 oracle 用户下
su - oracle
## 解压透明网关安装包
unzip -q p13390677_112040_linux-x86-64_5of7.zip
## 配置 vnc 访问图形化界面
vncserver
使用 vnc 客户端连接:
开始安装:
确认安装位置:
这里选择 for odbc
即可:
开始安装,静待结束:
root
用户下执行 root.sh
脚本:
/u01/app/orainventory/orainstroot.sh /u01/app/oracle/product/11.2.0/db/root.sh
配置监听:
至此,透明网关安装结束!
2.3、安装 mysql-connector
首先需要安装 unixodbc
依赖,否则报错:
安装 unixodbc
依赖后安装 mysql-connector
:
yum install -y unixodbc* rpm -ivh mysql-connector-odbc-8.0.27-1.el7.x86_64.rpm
📢 注意: 透明网关的安装到这里就全都结束了,接下来就是配置部分了。
3、透明网关配置
透明网关安装好之后,自然是需要配置才能使用的。
3.1、配置 odbc.ini
odbc.ini
文件用来存放 mysql 数据库相关信息,默认不存在,root
用户下手动创建即可:
cat</etc/odbc.ini
[lucifer]
description = odbc for mysql
driver = /usr/lib64/libmyodbc8w.so
server = 10.211.55.101
port = 3306
user = lucifer
password = lucifer
database = lucifer
eof
配置文件中的配置信息如下:
- [lucifer] 可以理解为是一个 sid 名称,可以自定义,后面配置需要用到;
- server 是指 mysql 数据库主机的 ip 地址;
- port 是指 mysql 数据库的端口;
- user 是指 oracle 需要访问的用户名;
- password 是指被访问用户的登录密码;
- database 是指需要 mysql 数据库需要被访问的 db 名称;
📢 注意: 如果有多个 mysql 数据库需要配置,则填写多个即可!
[lucifer]
description = odbc for mysql
driver = /usr/lib64/libmyodbc8w.so
server = 10.211.55.101
port = 3306
user = lucifer
password = lucifer
database = lucifer
[lucifer1]
description = odbc for mysql
driver = /usr/lib64/libmyodbc8w.so
server = 10.211.55.105
port = 3306
user = lucifer1
password = lucifer1
database = lucifer1
3.2、配置 init[sid].ora
切换至 oracle
用户,进入 $oracle_home/hs/admin
目录下,新建一个 init[sid].ora 文件:
cat<$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 configuration
set odbcini=/etc/odbc.ini
eof
这里 initsid.ora 中的 sid 名称和文件中 hs_fds_connect_info 参数值,就是上一步中我们配置 odbc.ini 文件中的 [lucifer]
名称。
📢 注意: 如果有多个 mysql 数据库需要配置,则创建多个 init[sid].ora 文件 即可!
3.3、配置监听
oracle 用户下,进入 $tns_admin
配置 listener.ora 文件:
cat<>$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
📢 注意: 如果有多个 mysql 数据库需要配置,则写成如下格式!
cat<>$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
重启监听:
lsnrctl stop lsnrctl start lsnrctl status
配置完成之后,测试是否可以连接 mysql 数据库:
isql lucifer
成功连接 mysql 数据库,至此透明网关配置完成!
4、oracle 数据库配置
透明网关配置完成后,就只需要配置 oracle 数据库来连接透明网关。
4.1、配置 tns
通过配置 tns 来连接透明网关,进入 tns 配置文件目录 $tns_admin
配置 tns:
cat<>$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
通过 tnsping
测试后,发现访问没有问题!
4.2、配置 dblink 连接 mysql 数据库
接下来只需要创建你 dblink 即可连接 mysql 数据库:
create public database link lucifer connect to "lucifer" identified by "lucifer" using 'lucifer';
测试连接操作 mysql 数据库:
select * from "lucifer"@lucifer order by "id";
delete from "lucifer"@lucifer where "id"=1;
至此,整个 oracle 配置透明网关访问 mysql 就完成了!
如果按照我的步骤来操作,整个流程走下来应该会比较顺畅,下面罗列一下我操作过程中遇到的一些报错:
1、init[sid].ora 配置文件的 hs_fds_shareable_name = /usr/lib64/libodbc.so
不正确,应该是 odbc 的 lib包:
error at line 1: ora-28500: connection from oracle to a non-oracle system returned this message: ora-02063: preceding line from dlk
2、init[sid].ora 里配置的 hs_language=american_america.zhs16gbk
字符集不正确或者没有配置,应该是 oracle
数据库字符集:
error at line 1: ora-28500: connection from oracle to a non-oracle system returned this message: [
3、执行查询操作时,表名需要带双引号,因为 mysql 默认表名是区分大小写,而 oracle 是不区分大小写的:
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
4、oracle 数据库配置 tns 时,没有加 (hs = ok)
:
error at line 1: ora-28546: connection initialization failed, probable net8 admin error ora-02063: preceding line from lucifer
本文部分内容参考文档: