本篇内容介绍了“Ubuntu16.04下怎么安装Oracle数据库的ODBC驱动”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在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驱动”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!