利用 Oracle Heterogeneous Services (HS) 透過 ODBC 連接 MySQL,實現 Oracle 直接查詢 MySQL 數據(DBLink 方式)。本文基於 CentOS 4.4 + Oracle 10g + MySQL 5.1 環境,記錄完整安裝配置步驟與遺留問題。
# 1. unixODBC(root)
rpm -Uvh unixODBC-2.2.12-1.el4s1.1.i386.rpm
# 2. MySQL ODBC Driver(root)
rpm -Uvh mysql-connector-odbc-5.1.5-0.i386.rpm
# 3. Oracle Gateway(oracle 用戶)
unzip 10201_gateways_linux32.zip
cd gateways && ./runInstaller
# 安裝路徑與 Oracle DB 共用同一 ORACLE_HOME
/etc/odbc.ini)[DSName]
Driver = /usr/lib/libmyodbc5.so
Description = MySQL
Server = xxx.xxx.xxx.xxx
Port = 3306
User = root
UID = root
Password = mypass
Database = mysqldbname
Option = 3
Socket =
charset = utf8
測試: isql -v DSName root mypass 成功顯示 Connected!。
$ORACLE_HOME/hs/admin/initDSName.oraHS_FDS_CONNECT_INFO = DSName
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /usr/lib/libmyodbc5.so
listener.ora 添加 SID_DESCSID_LIST_LISTENER =
(SID_LIST =
(SID_DESC = (SID_NAME=PLSExtProc) (ORACLE_HOME=...) (PROGRAM=extproc))
(SID_DESC = (GLOBAL_DBNAME=BOSS) (ORACLE_HOME=...) (SID_NAME=BOSS))
(SID_DESC = (SID_NAME=phpcms) (ORACLE_HOME=...) (PROGRAM=hsodbc)) -- 關鍵:PROGRAM=hsodbc
)
tnsnames.ora 添加服務DSName =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.125)(PORT=1521)))
(CONNECT_DATA = (SERVICE_NAME=DSName))
(HS = OK) -- 關鍵:標識異構服務
)
lsnrctl reload
lsnrctl service
# 應看到 Service "DSName" has 1 instance(s), status UNKNOWN, handler DEDICATED
tnsping DSName # OK
CREATE PUBLIC DATABASE LINK linkname
CONNECT TO "root" IDENTIFIED BY ""
USING 'DSName';
-- 測試查詢
SELECT "name" FROM t1@linkname;
| 問題 | 現象 | 原因/規避 |
|---|---|---|
| 字符集亂碼 | 中文顯示異常 | Oracle 與 MySQL 均建議使用 AL32UTF8 / utf8mb4,NLS_LANG 設置一致 |
| TEXT/BLOB 欄位報錯 ORA-28500 / 1064 | 查詢 text 欄位失敗 | MySQL ODBC 驅動對長文本處理有缺陷。 方案: 1. 視圖轉換 CAST(text_col AS CHAR(1000))2. 升級 DataDirect ODBC(需 MySQL Enterprise) 3. 應用層分離查詢,避免跨 DBLink 查長文本 |
SELECT 權限。