前言 我的情況是,本地安裝了oracle(安裝完成後帶有SQL Developer,不需要再安裝instantclient),創建dblink去連接遠程的mysql。有些朋友可能是 本地使用PL\SQL(需安裝instantclient)去連接 遠程oracle,連接成功後創建並使用dblink去連 ...
前言
我的情況是,本地安裝了oracle(安裝完成後帶有SQL Developer,不需要再安裝instantclient),創建dblink去連接遠程的mysql。有些朋友可能是 本地使用PL\SQL(需安裝instantclient)去連接 遠程oracle,連接成功後創建並使用dblink去連接遠程mysql,這時候要註意的是在遠程的oracle環境中配置對應的mysql-odbc。如果還是無法實現,可以看看我在文章里對於這個過程的理解,再對照自己的情況,逐步排查問題,希望對你有幫助。
實現參考:Oracle連接odbc數據源 http://www.cnblogs.com/mellowsmile/p/5218882.html
oracle 不同安裝包的區別(結合網上答案,自己整合琢磨的,如有錯誤,請大佬指出):
個人的Oracle安裝情況
oracle安裝參考教程:https://www.cnblogs.com/hoobey/p/6010804.html
我安裝的是32位的Oracle Database 11g R2(之所以選擇32位,是因為成功的案例都是用32位的,具體選擇的依據我沒查出來,有知道的大佬請不吝賜教,謝謝~),具體路徑見下截圖
oracle_home D:\guowenwen\product\11.2.0\dbhome_1,錯誤信息查找是在D:\guowenwen\product\11.2.0\dbhome_1\hs\trace目錄下
個人的安裝記錄
1、安裝32位mysql odbc驅動
下載路徑:https://dev.mysql.com/downloads/connector/odbc/
我是選擇尾碼為.msi的包進行安裝的,如果選擇zip文件那就不用再安裝了。安裝mysql odbc註意選擇32位/64位,選擇的依據不是根據你的操作系統的位數,而是根據軟體(Oracle版本)的位數,我安裝的oracle位數是32位,所以這裡選擇安裝32位的mysql odbc。如果你不知道怎麼選擇,那就64位和32位的mysql odbc都安裝了,你可以在C:\Program Files (x86)\Mysql中查看到32位的odbc,在C:\Program Files\MySQL中查看到64位的odbc(這邊查看的odbc的路徑或有不同,在這裡,我給出我的安裝路徑,目的是為了指出在C:\Program Files (x86)中安裝的是32位的程式,在C:\Program Files安裝的是64位的程式,我之前一直沒有搞清楚)
2、新建32位系統DSN(unicode driver)並需要測試成功
這裡需要清楚,安裝了32位的odbc那就需要新建32位的系統DSN。
1】在控制面板=》管理工具=》數據源(ODBC)=》新建系統DSN(unicode driver) 是64位的
2】在C:\Windows\SysWOW64\odbcad32.exe路徑下 新建的系統DSN 是32位的
註意這裡的Data Source Name,我這裡設置的是TESTMYSQL,在接下來的配置中會用到這個名稱。在TCP/IP中輸入你要遠程連接的mysql資料庫的IP地址,要點擊Test按鈕進行測試,測試成功方可
3、在D:\guowenwen\product\11.2.0\dbhome_1\NETWORK\ADMIN目錄的listener.ora 文件中添加紅色的信息(如果該目錄下沒有listener.ora文件,那就自己新建一個,下麵是我所有的配置內容)
#ORACLE_HOME按需替換
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC=
(SID_NAME=TESTMYSQL) #這裡SID_NAME一定要和第二步建立的odbc名字一致
(ORACLE_HOME=D:/guowenwen/product/11.2.0/dbhome_1)
(PROGRAM=dg4odbc) #一定要寫dg4odbc
)
(SID_DESC=
(SID_NAME=dg4odbc)
(ORACLE_HOME=D:\guowenwen\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc)
)
#就我本人來說,這個目錄下是沒有listener.ora文件的,此時我可以用SQL Developer連接上本地oracle資料庫,但是我自己配置了listener.ora文件後,就無法連接本地oracle了
#解決方案就是添加以下的代碼塊,再重啟監聽就可以了
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = D:\guowenwen\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = PNPKEY))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
4、在D:\guowenwen\product\11.2.0\dbhome_1\NETWORK\ADMIN目錄的tnsnames.ora文件中添加紅色的信息(如果該目錄下沒有tnsnames.ora文件,那就自己新建一個,下麵是我所有的配置內容)
#這裡的內容和listener.ora是對應的
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
TESTMYSQL =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)) #ORACLE伺服器的IP,我是在本地oracle上創建dblink,所以HOST填localhost
(CONNECT_DATA=
(SID=TESTMYSQL)) #這裡的SID和第二步的odbc名字一致
(HS=OK) #一定要加
)
dg4odbc =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=dg4odbc))
(HS=OK)
)
5、在D:\guowenwen\product\11.2.0\dbhome_1\hs\admin目錄下創建initXXX.ora文件,XXX的名字要與第二步odbc的名字一致,本例中創建 initTESTMYSQL.ora文件,添加以下代碼
HS_FDS_CONNECT_INFO = TESTMYSQL #註意這裡的名字
HS_FDS_TRACE_LEVEL = debug #調試狀態,如果連接出錯,在路徑D:\guowenwen\product\11.2.0\dbhome_1\hs\trace下可以看到錯誤信息
6、重啟監聽
兩個選擇,一是圖形化界面操作,二是打開cmd操作,這裡選擇第二種
右鍵單擊cmd,以管理員身份運行(不然可能會提示:TNS-01190: The user is not authorized to execute the requested listener command),輸入以下命令(都需要執行成功,有錯誤自己找一下解決方案)
C:\Users\guowenwen>lsnrctl stop
C:\Users\guowenwen>lsnrctl start
C:\Users\guowenwen>tnsping MYSQL_LOCAL
7、打開SQL Developer,創建DBLINK
如果使用dblink出錯,查看Oracle_HOME\hs\trace的報錯信息,如果出現類似內容Access denied for users 'mysql用戶名'@‘mysql的ip地址’,原因可能是創建dblink時用戶名和密碼沒加“ ”
create database link MYSQL_LOCAL connect to "mysql用戶" identified by “mysql用戶密碼” using 'MYSQL_LOCAL'; //using後面的名字應該與第二步odbc名字一致
8、使用DBLINK
select * from "表名"@MYSQL_LOCAL;
個人的原理解析
參考:oracle HS 深入解析 及協同Gateway工作流程 http://www.cnblogs.com/wwwiori/archive/2009/06/22/1508068.html
要點(個人的理解,沒有深入研究,如果有錯誤請大佬們不吝賜教):oracle——dg4odbc——odbc——mysql
在本地oracle上使用dblink時(步驟7,8),oracle會連接到HS,HS會去對應目錄下查找設置的Agent Componet Code(步驟5),因為我是直接安裝了Oracle database(預設安裝ODBC Agent),對應的Agent Componet Code是dg4odbcc.exe(對應的步驟3,4,這也是步驟4中設置PROGRAM=dg4odbc的原因),Agent Componet Code接下來去查找Driver(需要連接的資料庫的驅動,即步驟1步驟的操作),連接到Driver後,Driver去連接DB(即步驟2,其意義是讓Driver知道怎麼連接對應的DB),遠程DB接收到來自本地Oracle的命令,執行並一步步返回。
總結
實現需求的過程中,搜索問題的解決方案時我發現有些文章說需要用到Database Gateways(舉的例子是sqlserver),當時也不知道連接mysql不成功是不是因為沒安裝Gateways的原因(雖然現在知道對於連接mysql來說並不需要),就去找Gateways的知識。但問題是,我找gateways的下載路徑就找了很久,更別說其他,現在貼出相關的鏈接,給有需要的朋友一點參考,減少搜索時間。
gateway下載地址參考:http://www.cnblogs.com/tuyile006/p/4142395.html
oracle database gateway for odbc 介紹:https://docs.oracle.com/database/122/ODBCU/database-gateway-for-odbc-introduction.htm#ODBCU100
最後,還是這句話,如果在閱讀的過程中發現了任何問題,還請各位大佬們不吝賜教,感謝~~