ITPub博客

首页 > 数据库 > Oracle > Ubuntu 16.04下安装Oracle数据库的ODBC驱动

Ubuntu 16.04下安装Oracle数据库的ODBC驱动

原创 Oracle 作者:cow977 时间:2019-12-13 15:31:58 0 删除 编辑

Ubuntu 16.04下要连接远程的 Oracle数据库,有多种方式,本文介绍通过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;                                                              *

*      http://www.unixodbc.org                                               *

*      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驱动程序:

进入官网https://www.oracle.com/database/technologies/instant-client/ 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-03-02

  • 博文量
    698
  • 访问量
    786885