Ubuntu16.04下怎么安装Oracle数据库的ODBC驱动

62次阅读
没有评论

共计 6749 个字符,预计需要花费 17 分钟才能阅读完成。

本篇内容介绍了“Ubuntu16.04 下怎么安装 Oracle 数据库的 ODBC 驱动”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在 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 的连接失败。

改正配置参数后问题解决。

“Ubuntu16.04 下怎么安装 Oracle 数据库的 ODBC 驱动”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计6749字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)