Ubuntu 16.04下安裝Oracle資料庫的ODBC驅動

cow977發表於2019-12-13

在 16.04下要連線遠端的 資料庫,有多種方式,本文介紹透過ODBC方式來實現客戶端遠端訪問Oracle資料庫。

1 、要透過ODBC方式連線遠端資料庫,客戶端需要有ODBC管理程式,在Linux系統下,可以用以下命令檢查ODBC的環境和配置:

(1) 檢查系統是否安裝ODBC管理程式:

csyy@server02:~$ dpkg -l | grep odbc

Desired=Unknown/Install/Remove/Purge/Hold

| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend

|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)

||/ Name                    Version      Architecture Description

+++-=======================-============-============-=========================

ii  libodbc1:amd64          2.3.7        amd64        ODBC library for Unix

ii  msodbcsql17             17.4.2.1-1   amd64        ODBC Driver for Microsoft(R) SQL Server(R)

ii  odbcinst                2.3.7        amd64        Helper program for accessing odbc ini files

ii  odbcinst1debian2:amd64  2.3.7        amd64        Support library for accessing odbc ini files

ii  unixodbc                2.3.7        amd64        Basic ODBC tools

ii  unixodbc-dev            2.3.7        amd64        ODBC libraries for UNIX (development files)

如果未找到ODBC管理程式,可用以下命令來安裝:

sudo apt-get install unixodbc

(2) 檢查ODBC環境配置:

csyy@server02:~$ odbcinst

******************************************************************************

* unixODBC - odbcinst                                                        *

******************************************************************************

* Purpose:                                                                   *

*      An ODBC Installer and Uninstaller.                                    *

*      Updates system files, and increases/decreases usage counts but        *

*      does not actually copy or remove any files.                           *

* Syntax:                                                                    *

*      odbcinst Action Object Options                                        *

* Action:                                                                    *

*      -i         install                                                    *

*      -u         uninstall                                                  *

*      -q         query                                                      *

*      -j         print config info                                          *

*      -c         call SQLCreateDataSource                                   *

*      -m         call SQLManageDataSources                                  *

*      --version  version                                                    *

* Object:                                                                    *

*      -d driver                                                             *

*      -s data source                                                        *

* Options:                                                                   *

*      -f file name of template.ini follows this (valid for -i)              *

*      -r get template.ini from stdin, not a template file                   *

*      -n Driver or Data Source Name follows                                 *

*      -v turn verbose off (no info, warning or error msgs)                  *

*      -l system dsn                                                         *

*      -h user dsn                                                           *

* Returns:                                                                   *

*      0   Success                                                           *

*     !0   Failed                                                            *

* Please visit;                                                              *

*                                      *

*      pharvey@codebydesign.com                                              *

******************************************************************************

 

csyy@server02:~$ odbcinst -j

unixODBC 2.3.7

DRIVERS............: /etc/odbcinst.ini

SYSTEM DATA SOURCES: /etc/odbc.ini

FILE DATA SOURCES..: /etc/ODBCDataSources

USER DATA SOURCES..: /home/csyy/.odbc.ini

SQLULEN Size.......: 8

SQLLEN Size........: 8

SQLSETPOSIROW Size.: 8

從配置環境來看, ODBC 驅動的配置檔案是/etc/odbcinst.ini,系統DSN的配置檔案是/etc/odbc.ini,檔案DSN的配置檔案是/etc/ODBCDataSources,而使用者DSN的配置檔案則是$HOME/.odbc.ini。

2 、下載並安裝oracle ODBC驅動程式:

進入官網 linux-x86-64-downloads.html下載如下所需的安裝包。

oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm

進行安裝

sudo alien -i oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm

此處採用了rpm包來安裝Oracle for ODBC的驅動程式,也可透過zip包來安裝。

Oracle for ODBC 驅動程式的安裝目錄是/usr/share/oracle/11.2/client64。

3 、有關Oracle客戶端的安裝,可以參考:

http://blog.itpub.net/81227/viewspace-2668066/

4 、配置Oracle 11gR2的ODBC:

root@server02:~# cd /usr/share/oracle/11.2/client64

root@server02:/usr/share/oracle/11.2/client64# ./odbc_update_ini.sh /

odbc_update_ini.sh 引數說明:

引數1:unixODBC安裝路徑。

引數2:驅動安裝的絕對路徑(可選)。預設為執行指令碼的路徑。

引數3:驅動名(可選),預設為Oracle 11g ODBC driver。

引數4:資料來源名稱(可選)。

執行完成後,將在/etc/odbcinst.ini檔案中新增有關Oracle for ODBC的驅動程式配置資訊,名稱為 Oracle 11g ODBC driver ;同時,也會新增一個DSN條目到$HOME/.odbc.ini和/etc/odbc.ini,名稱為:OracleODBC-11g

root@server02:/usr/share/oracle/11.2/client64# cat /etc/odbcinst.ini

[Oracle 11g ODBC driver]

Description     = Oracle ODBC driver for Oracle 11g

# Driver          = /usr/share/oracle/11.2/client64/libsqora.so.11.1

Driver          = /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1

Setup           =

FileUsage       =

CPTimeout       =

CPReuse         =

驅動程式的動態庫配置錯誤,不是在/usr/share目錄下,而是在/usr/lib目錄下。

root@server02:/usr/share/oracle/11.2/client64# cat /etc/odbc.ini

[OracleODBC-11g]

Application Attributes = T

Attributes = W

BatchAutocommitMode = IfAllSuccessful

BindAsFLOAT = F

CloseCursor = F

DisableDPM = F

DisableMTS = T

Driver = Oracle 11g ODBC driver       # 對應/etc/odbcinst.ini中的驅動配置名稱

DSN = OracleDSN

EXECSchemaOpt =

EXECSyntax = T

Failover = T

FailoverDelay = 10

FailoverRetryCount = 10

FetchBufferSize = 64000

ForceWCHAR = F

Lobs = T

Longs = T

MetadataIdDefault = F

QueryTimeout = T

ResultSets = T

ServerName = OracleDATA      # 對應tnsnames.ora中配置的本地服務名

SQLGetData extensions = F

Translation DLL =

Translation ption = 0

DisableRULEHint = T

UserID =

配置完ODBC配置檔案後,可以透過isql連線Oracle資料庫。

命令:isql <資料來源名稱> <使用者名稱> <密碼> [-v]

 

下面講述一下在實際安裝過程中遇到的幾個問題。

問題1:關於驅動程式 libsqora.so.11.1 的路徑問題。

預設安裝配置後,配置檔案中的檔案是在/usr/share/oracle/11.2/client64路徑下,可實際檢查在此目錄中並未發現此檔案。

Driver          = /usr/share/oracle/11.2/client64/libsqora.so.11.1

透過find命令查詢,在/usr/lib/oracle/11.2/client64/lib目錄中發現此檔案,故修改配置如下。

Driver          = /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1

問題2:初次執行isql命令,報“ORA-12162”和“ORA-12545”錯誤。

root@server02:~# isql OracleODBC-11g OracleUser OraclePassword -v

[S1000][unixODBC][Oracle][ODBC][Ora]ORA-12162: TNS:net service name is incorrectly specified

[ISQL]ERROR: Could not SQLConnect

查Oracle文件,解釋為Oracle連線字串不正確。

ORA-12162: TNS:net service name is incorrectly specified

 Cause: The connect descriptor corresponding to the net service name in TNSNAMES.ORA or in the directory server (Oracle Internet Directory) is incorrectly specified.

Action: If using local naming make sure there are no syntax errors in the corresponding connect descriptor in the TNSNAMES.ORA file. If using directory naming check the information provided through the administration used for directory naming.

ORA-12162: TNS:net 服務名稱指定不正確

原因:與TNSNAMES.ORA或Oracle目錄伺服器中的網路服務名稱對應的連線描述符指定不正確。

操作:如果使用本地命名,請確保TNSNAMES.ORA檔案中相應的連線描述符中沒有語法錯誤。如果使用目錄命名,請檢查透過用於目錄命名的管理提供的資訊。

再仔細檢查Oracle TNS配置,未發現有配置錯誤。

再次上網查詢,有講是“詭異的故障背後的原因竟然是那樣的基礎:ORACLE_SID沒有指定!”。

確認系統當前的ORACLE_HOME和ORACLE_SID環境變數:

root@server02:~# echo $ORACLE_HOME

/usr/lib/oracle/11.2/client64

root@server02:~# echo $ORACLE_SID

 

可見,此時只設定了ORACLE_HOME環境變數,但ORACLE_SID此時為空,這是該問題的真實原因嗎?

一般來說,Oracle客戶端是不需要設定ORACLE_SID環境變數的。

那就先試試看吧。

root@server02:~# export ORACLE_SID=orcl

root@server02:~# isql OracleODBC-11g OracleUser OraclePassword -v

[S1000][unixODBC][Oracle][ODBC][Ora]ORA-12545: Connect failed because target host or object does not exist

[ISQL]ERROR: Could not SQLConnect

一個“ORA-12162”問題剛解決,又來一個“ORA-12545”錯誤

ORA-12545: Connect failed because target host or object does not exist

 Cause: The address specified is not valid, or the program being connected to does not exist.

Action: Ensure the ADDRESS parameters have been entered correctly; the most likely incorrect parameter is the node name. Ensure that the executable for the server exists (perhaps "oracle" is missing.) If the protocol is TCP/IP, edit the TNSNAMES.ORA file to change the host name to a numeric IP address and try again.

ORA-12545 :連線失敗,因為目標主機或物件不存在

原因:指定的地址無效,或者連線的程式不存在。

操作:確保地址引數輸入正確;最有可能不正確的引數是節點名。確保伺服器的可執行檔案存在(可能是“Oracle”丟失)。如果協議是TCP/IP,則編輯TNSNAMES.ORA檔案,將主機名更改為數字IP地址,然後重試。

問題再次回到連線字串上,指明問題原因是未指定連線字串或連線字串中的目標主機或物件不存在。

再次回到ODBC的配置上,發現了問題的根源,是系統安裝後會存在多個ODBC的DSN配置檔案:/etc/odbc.ini(全域性配置)和~/.odbc.ini(使用者配置),同名的DataSource造成了配置混亂。在修改ODBC資料來源的配置時,直接在全域性配置檔案中修改了配置引數,並引用了原有的DSN名稱,造成了在全域性配置檔案(配置是正確的)和使用者配置檔案(配置錯誤,未指定ServiceName引數)中的配置衝突,而優先順序又是使用者配置高於全域性配置,導致了ODBC的連線失敗。

改正配置引數後問題解決。

注意:使用者DSN配置,優先於全域性系統DSN配置。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-2668511/,如需轉載,請註明出處,否則將追究法律責任。

相關文章