1.1.1. 文檔編寫目的
項目上需要做與Mysql數據庫的對接,然而Oracle與Mysql數據庫是異構的,因此這里采用透明網關的方式來解決。
另,項目上的環境為APP:12.2.6 ; DB: 12.1.0
主要配置如下:
2.1 確定使用32/64 bit的驅動
登陸服務器,執行指令:file $ORACLE_HOME/bin/dg4odbc
從上可以看出是64位,需要安裝64位驅動。
注:這里需要嚴格匹配。
2.2 下載ODBC驅動管理
ODBC 造就了"應用程序獨立性"的特性,使應用程序不需在乎數據源是何種數據庫系統或者純粹是個資料或文本文件,只要相對驅動程序能完成銜接的功能,則應用程序即可達到高度的獨立性。
下載網址(文檔鏈接在文章結尾):http://sourceforge.net/projects/unixodbc/files/unixODBC/2.2.14/unixODBC-2.2.14-linux-x86-64.tar.gz/download
這里,注意以下幾點:
1.要用root賬戶進行解壓、修改配置文件的操作;
2.最好將文件放在/tmp目錄下進行操作,因為linux文件系統針對不同的用戶對不同文件夾有不同的讀寫權限,但/tmp目錄下所有的用戶都可以進行讀寫和修改。
因此,本文檔的解壓路徑等都放在/tmp路徑下。
2.3 安裝ODBC驅動管理
將下載的文件放在/tmp目錄下,用root賬戶登錄服務器。
1.在/tmp目錄下執行命令:tar zxvf unixODBC-2.2.14-linux-x86-64.tar.gz
默認會解壓到usr/local目錄下,包含bin,include ,lib 三個目錄。
2.創建文件夾 unixodbc-2.2.14,執行命令:mkdir unixodbc-2.2.14
3.進入創建的文件夾,執行命令:cd unixodbc-2.2.14
4.將剛解壓的文件復制到當前目錄下,執行指令:mv /tmp/usr/local/* .
注意:命令后面還有個點
5.更改配置文件,這里切換到ora賬戶下執行,修改home目錄下的.bash_profile文件,如下:
執行指令:vi ~/.bash_profile
添加如下:export LD_LIBRARY_PATH=/tmp/unixodbc-2.2.14/lib
export PATH=/usr/sbin:/tmp/unixodbc-2.2.14/bin:$PATH
如圖所示:
注意:配置文件中不能‘=’兩邊不能有空格。
修改完后,保存(ctrl+c 切換出來,輸入:wq! 執行linux的強制保存命令)。
6.執行命令:source ~/.bash_profile,查看修改的配置文件是否有錯誤,例如:若在配置文件中添加空格,配置文件無效,執行該命令可查看報錯的信息。
2.4 下載mysql連接odbc的驅動
下載網址:http://www.mysql.com/downloads/connector/odbc/5.1.html
1.將tar包同上放在/tmp文件夾內,執行解壓命令(切換到root用戶下):
tar zxvf mysql-connector-odbc-5.1.13-linux-glibc2.5-x86-64bit.tar.gz
2.在當前目錄下,建立新的文件夾,執行命令:mkdir mysqlodbc_5.1.13
3.將解壓的文件放在新建的文件夾內。執行命令:mv mysql-connector-odbc-5.1.13-linux-glibc2.5-x86-64bit.tar.gz mysqlodbc_5.1.13
2.5 配置ODBC數據源
還是在root用戶下(因為root用戶有修改如下配置文件的權限,否則會報錯)。
1.cd /etc
2.修改目錄下的 odbc.ini 文件,添加如下代碼:
[myodbc3]
Driver = /usr/lib64/libmyodbc5.so
Description = MySQL ODBC 5.1 Driver DSN
SERVER = XXX.XX.XX.XX
PORT = 3306
USER = XXXXX
Password = XXXX
Database = XXX
OPTION = 3
SOCKET =
charset = utf8
如圖所示:
注意如下幾點:
1.Driver目錄下的驅動文件一定要有;
2.server是指mysql數據庫的IP;
3.mysql數據庫默認端口為3306;
4.user是指mysql數據庫給我們訪問的用戶;
5.password是指MySQL數據庫給我們訪問的用戶密碼;
6.database是指mysql數據庫的實例。
2.6 將odbc.ini 加入到配置文件中
用ora用戶登陸服務器。修改 .bash_profile 文件。
增添如下:
export ODBCINI=/etc/odbc.ini
ODBCSYSINI=/etc;export ODBCSUSINI
ODBCINSTINI=/etc/odbc.ini
export ODBCINSTINI
如圖:
最后,執行:source ~/.bash_profile
2.7 測試連通
在ora 用戶或者 root 用戶執行: isql myodbc3 -v。
出現如下圖所示,表示連通。
2.8 配置 tnsnames.ora
1.在ora用戶下,輸入命令:cd $TNS_ADMIN
2.輸入命令:vi tnsnames.ora
3.添加如下:
myodbc3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SID =myodbc3))
(HS=OK)
)
注意:端口編號有時可能會沖突,注意修改,和listener中的端口號一致即可;
和其他TNS的端口號一致即可。
HS=OK 必輸,因為連接需要用此來標識是數據庫內部的連接還是同其他數據庫的連接。
2.9 配置 listener.ora
1.在ora用戶下,輸入命令:cd $TNS_ADMIN
2.輸入命令:vi listener.ora
3.添加如下:
SID_LIST_TEST =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME= /u01/test/db/12.1.0)
(SID_NAME = TEST)
)
(SID_DESC=
(PROGRAM = dg4odbc)
(SID_NAME= myodbc3)
(ORACLE_HOME= /u01/test/db/12.1.0)
(ENVS=LD_LIBRARY_PATH=/tmp/unixodbc-2.2.14/lib)
)
)
如下圖所示:
注意如下幾點:
1.ORACLE_HOME要和上面的路徑一致;
2.ENVS同 .bash_profile里面配置的路徑相同;
3.注意上面TSET的端口號 1522,同tnsnames里面的端口號一致;
4.注意SID名稱不同數據庫不一致。
2.10 配置監聽的初始化文件
1. 進入如下路徑:cd $ORACLE_HOME/hs/admin
注意:名字要跟odbc配置的名字一樣,這里是myodbc3。
2. 在上面的路徑下面找到:initdg4odbc.ora,重命名為initmyodbc3.ora。
注意:紅色與上面名稱相同
3. 添加如下:
HS_FDS_CONNECT_INFO=myodbc3
HS_FDS_TRACE_LEVEL=ON
HS_FDS_TRACE_FILE_NAME=odbc_test.log
HS_FDS_TRACE_LEVEL=4
HS_FDS_SHAREABLE_NAME=/tmp/unixodbc-2.2.14/lib/libodbc.so
HS_FDS_SUPPORT_STATISCTICS=FALSE
HS_LANGUAGE=AMERICAN_AMERICA.UTF8
HS_NLS_NCHAR=UCS2
HS_FDS_SQLLEN_INTERPRETATION=32
set ODBCINI=/etc/odbc.ini
如下圖所示:
注意其他的都要注釋掉,否則會報上面圖片的錯誤。
2.11 測試及重啟監聽
1.在ora用戶下輸入如下指令,測試監聽:tnsping myodbc3
2.出現如下,則說明tns拼通
3.重啟監聽:
執行如下:
lsnrctl stop
lsnrctl start
lsnrctl status
出現如圖則說明監聽生效。
注意:若tns無法ping通,請檢查前面的配置以及listener和tnsnames的輸入數據。
2.12 創建DBLINK
1.在ora用戶執行:sqlplus,輸入apps賬戶和密碼
2.輸入如下指令:create public database link myodbc3 connect to "mysql_user" identified by "password" using'myodbc3';
3.查看mysql的表,看是否能夠連接:select * from"dual"@myodbc3;
oracle實現異構連接分為兩種方式,基本原理:
1. Generic Heterogeneous Services,通用異構服務
服務器端安裝non-oracle db的client,使用其所帶odbc驅動建立其數據源,然后oracle通過hs組件建立與odbc之間的dblink從而實現異構連接。
2. Transparent Gateway,透明網關
安裝透明網關,選擇相應non-oracle db網關選項,建立監聽連接透明網關,進而dblink實現異構連接。
錯誤解決:
1.ORA-28528:多機種服務數據類型轉換出現錯誤
[oracle][odbc sybase wire protocol driver]string data,right truncated.error in column 3.{01004}
ora-02063:緊接着2Line(起自to_sybase)
ORA-28528:
Heterogeneous Services datatype conversion error Cause: Either an Oracle datatype could not be converted to a non-Oracle datatype, or a non-Oracle datatype could not be converted to an Oracle datatype. The following are possible reasons for for the conversion failure: -- overflow problems (in the case of numbers) -- length limitations (in the case of character strings) -- invalid values passed into the conversion routines
Action: Contact customer support of the agent vendor. If the problem is due to size discrepancies between Oracle and the non-Oracle system, it may not be possible to convert the value
2.ora-28511: 丟失與使用sid=……的多機種遠程代理程序的rpc連接
ORA-28511:
lost RPC connection to heterogeneous remote agent using SID=string Cause: A fatal error occurred in one of the following places: -- the connection between the ORACLE server and the agent -- the heterogeneous services remote agent itself -- the connection to the non-Oracle system This error occurred after communication had been established successfully.
Action: Check for network problems and remote host crashes. The problem is probably in the agent software. If so, contact a customer support representative of the agent vendor.
sybase通用異構服務連接odbc查詢遠程db不同字符集時報錯,可以使用odbc日志調試分析,連接可以建立,但查詢失敗。使用透明網關解決。
3.ora-28500:連接oracle到非oracle系統時返回此信息:[MICROSOFT][ODBC驅動程序管理器]未發現數據源名並且未指定默認驅動程序
原因:根據錯誤提示,sid未配置正確。重新配置解決。
4.ora-28500:連接oracle到非oracle系統時返回此信息:[IBM][CLI DRIEVER] SQL30082N嘗試建立連接失敗,安全性原因為“24”("username and/or password invalid").sqlstate=08001
原因:用戶名、密碼不匹配。ora-28500錯誤根據錯誤提示應該就可解決。
5.ora-02050:事務處理4.7.2886已回退,某些遠程數據庫可能有問題
ORA-02050:
transaction string rolled back, some remote DBs may be in-doubt Cause: network or remote failure in 2PC.
Action: Notify operations; remote DBs will automatically re-sync when the failure is repaired.
解決:須dba手工提交或回滾事務,自行保證一致性。
dbms_transaction.purge_lost_db_entry('4.7.2886');commit;
具體解決方式需視情況而定。
phase local_state remote_state action
prepare collecting / 本地DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY
prepared / 本地rollback force后PURGE_LOST_DB_ENTRY
commit prepared commited 本地commit force后本地和遠程均PURGE
commited commited 本地和遠程均PURGE_LOST_DB_ENTRY
forget commited / 本地PURGE_LOST_DB_ENTRY