个人在安装配置时遇到一些麻烦,特此记录如下: 环境 数据库服务器操作系统:windows 2003 数据库:oracle database 10g enterprise edition release 10.2.0.1.0 erlang运行的服务器操作系统:redhat 5.3 erlang:erlang r14b03 (erts-5.8.4) 注意 ==========
个人在安装配置时遇到一些麻烦,特此记录如下:
环境
数据库服务器操作系统:windows 2003
数据库:oracle database 10g enterprise edition release 10.2.0.1.0
erlang运行的服务器操作系统:redhat 5.3
erlang:erlang r14b03 (erts-5.8.4)
注意===============================================================================
redhat 5.3中默认安装的unixodbc是2.2.11版本,这个版本与oracle的odbc驱动不兼容。所以需要将先将其卸载,然后安装unixodbc 2.3.0
卸载unixodbc的rpm包:
rpm -e mysql-connector-odbc-3.51.12-2.2.i386
rpm -e unixodbc-devel-2.2.11-7.1
rpm -e unixodbc-2.2.11-7.1
下载安装unixodbc 2.3.0
从www.unixodbc.org处下载,或者
http://olex.openlogic.com/package_versions/download/10003?package_version_id=5966&path=openlogic%2funixodbc%2f2.3.0%2fopenlogic-unixodbc-2.3.0-all-src-2.zip
在configure时加两个参数:--sysconfdir=/etc --prefix=/usr
然后make install就可以啦
安装完成后执行odbcinst -j可以看到配置文件等的位置
===============================================================================
1. 从oracle网站下载客户端安装包
http://download.oracle.com/otn/linux/instantclient/11203/oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm
http://download.oracle.com/otn/linux/instantclient/11203/oracle-instantclient11.2-odbc-11.2.0.3.0-1.i386.rpm
最好再安装一下sqlplus
http://download.oracle.com/otn/linux/instantclient/11203/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.i386.rpm
2. 配置lib目录
cd /usr/lib/oracle/11.2/client/lib
pwd >>/etc/ld.so.conf
ldconfig
3. 修改/etc/odbcinst.ini
增加如下:
# driver form oracle
[oracle]
desription = odbc for oracle
driver = /usr/lib/oracle/11.2/client/lib/libsqora.so.11.1
setup = /usr/lib/liboraodbcs.so
fileusage = 1
这个加到odbcinst.ini文件的最后。测试时用,正常使用时应该去掉
[odbc]
trace = 1
tracefile =/tmp/odbc.log
debug = 1
pooling = no
4. 修改/etc/odbc.ini
增加如下
[orcl_146] #本地数据源名
description = odbc for oracle
driver = oracle
server = 192.168.1.146
port = 1521
servername = orcl_146 #tnsnames.ora中的服务名
userid = mycomm
password = mycomm123
5. 增加/usr/lib/oracle/11.2/network/admin/tnsnames.ora
orcl_146 =
(description =
(address = (protocol = tcp)(host = 192.168.1.146)(port = 1521))
(connect_data =
(server = dedicated)
(service_name = orcl)
)
)
其中orcl_146要与odbc.ini的servername相同,
service_name为oracle的服务名
host为数据库所在主机ip,port为数据库所在主机port。
6. 在/etc/profile中增加:
export tns_admin=/usr/lib/oracle/11.2/network/admin/
然后,为了让tns_admin环境变化现在就生效,执行
. /etc/profile
7. 用isql测试一下
isql orcl_146 -v
出错:
[01000][unixodbc][driver manager]can't open lib '/usr/lib/oracle/11.2/client/lib/libsqora.so.11.1' : libclntsh.so.11.1: cannot open shared object file: no such file or directory
[isql]error: could not sqlconnect
发现是没有libclntsh.so.11.1这个库文件,这个库文件在/usr/lib/oracle/11.2/client/lib/下,之所以没有找到是由于在第2步时执行ldconfig的终端不是现在执行isql的终端。
重新执行一下ldconfig
再执行isql orcl_146 -v
出错:
isql: symbol lookup error: /usr/lib/oracle/11.2/client/lib/libsqora.so.11.1: undefined symbol: sqlgetprivateprofilestringw
这个问题就是unixodbc的版本问题啦,如果前面安装了unixodbc 2.3.0的话不会出现这个错误
如果sqlplus可以连接,但isql不可以,需要确认是否export了tns_admin这一环境变量
8. erlang odbc 连接oralce时出错如下:
------------------------------------------
erlang r14b03 (erts-5.8.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
eshell v5.8.4 (abort with ^g)
1> odbc:start().
ok
2> odbc:connect(dsn=orcl_146;uid=scott;pwd=tiger, []).
=error report==== 21-oct-2011::19:23:49 ===
odbc: received unexpected info: {tcp_closed,#port}
{error,connection_closed}
3>
=error report==== 21-oct-2011::19:23:49 ===
** generic server terminating
** last message in was {#port,{exit_status,23}}
** when server state == {state,#port,
{,#ref},
,undefined,on,undefined,undefined,on,
connecting,undefined,0,
[#port,#port],
#port,#port}
** reason for termination ==
** {port_exit,collecting_of_driver_information_faild}
----------------------------------------------
根据这里的方法
http://www1.erlang.org/pipermail/erlang-questions/2005-august/016816.html
这样连接就可以啦
3> odbc:connect(dsn=orcl_146;uid=scott;pwd=tiger, [{scrollable_cursors, off}]).
{ok,}
4>
其实这里可以不用uid和pwd,只要一个dsn就可以啦,形如:
odbc:connect(dsn=orcl_146, [{scrollable_cursors, off}]).