前言
從 Oracle 無法直接訪問 Mysql 數據庫,需要配置透明網關后通過 DBLink 實現訪問。
今天搞了一下午透明網關配置,流程比較復雜,并且有一些坑,這不立刻來給大家排排坑,說不定以后就用的著呢!
廢話不多說,直接實戰(zhàn)走起~
一、環(huán)境準備
本次環(huán)境準備了 3 臺主機,分別是 Oracle 數據庫,MySQL 數據庫,透明網關。
?? Linux 主機安裝教程可參考:實戰(zhàn)篇:VMware Workstation 虛擬機安裝 Linux 系統(tǒng) ?? Oracle 單機安裝教程可參考:實戰(zhàn)篇:Linux 安裝 Oracle 11GR2 數據庫保姆級教程 ?? Oracle RAC 安裝教程可參考:實戰(zhàn)篇:一步步教你 Linux 7 安裝 Oracle 11GR2 RAC ?? Oracle 腳本一鍵安裝可參考:開源項目:Install Oracle Database By Scripts! ?? MySQL 安裝教程可參考:實戰(zhàn)篇:手把手教你Linux安裝Mysql(細致入微)
?? Oracle 安裝包合集和補丁下載地址:2021年Oracle第三季度補丁合集
環(huán)境信息:
用途 主機名 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 環(huán)境下,無需重復安裝配置多個節(jié)點
📢 注意: 透明網關主機的配置不需要很高,無需安裝 Oracle 數據庫,僅安裝透明網關即可!
二、實戰(zhàn)演示
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、主機環(huán)境配置
下載上述安裝介質并上傳透明網關主機:
📢 注意: 安裝透明網關之前需要配置環(huán)境和創(chuàng)建用戶等等,可以參照 Linux 安裝單機 Oracle 的環(huán)境配置步驟,這里就不再詳述了!
使用 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 用戶下執(zhí)行 root.sh 腳本:
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/11.2.0/db/root.sh
配置監(jiān)聽:
至此,透明網關安裝結束!
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 用戶下手動創(chuàng)建即可:
cat<< EOF> /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<< 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 Configuration
set ODBCINI = /etc/odbc.ini
EOF
這里 initSID.ora 中的 SID 名稱和文件中 HS_FDS_CONNECT_INFO 參數值,就是上一步中我們配置 odbc.ini 文件中的 [lucifer] 名稱。
📢 注意: 如果有多個 MySQL 數據庫需要配置,則創(chuàng)建多個 init[SID].ora 文件 即可!
3.3、配置監(jiān)聽
oracle 用戶下,進入 $TNS_ADMIN 配置 listener.ora 文件:
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
📢 注意: 如果有多個 MySQL 數據庫需要配置,則寫成如下格式!
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
重啟監(jiān)聽:
lsnrctl stop
lsnrctl start
lsnrctl status
配置完成之后,測試是否可以連接 MySQL 數據庫:
isql lucifer
成功連接 MySQL 數據庫,至此透明網關配置完成!
4、Oracle 數據庫配置
透明網關配置完成后,就只需要配置 Oracle 數據庫來連接透明網關。
4.1、配置 TNS
通過配置 TNS 來連接透明網關,進入 TNS 配置文件目錄 $TNS_ADMIN 配置 TNS:
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
通過 tnsping 測試后,發(fā)現訪問沒有問題!
4.2、配置 DBLink 連接 MySQL 數據庫
接下來只需要創(chuàng)建你 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、執(zhí)行查詢操作時,表名需要帶雙引號,因為 MySQL 默認表名是區(qū)分大小寫,而 Oracle 是不區(qū)分大小寫的:
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
本文部分內容參考文檔:Oracle透明網關訪問MySQL數據庫