1.首先要知道什么是ORACLE的客户端:
OracleInstantclient是oracle提供的简便客户端,支持多种平台.可从oracle网站下载,下载地址为http://www.oracle.com/technology/tech/oci/instantclient/index.html
包括如下内容:
InstantclientPackage-Basic运行OCI,OCCI,和JDBC-OCI应用程序需要的所有文件.
InstantclientPackage-BasicLite:只包含英语错误信息,只支持unicode,ascii,西欧字符集.
InstantclientPackage-JDBCSupplement为jdbc增加了xa,国际化和RowSet操作.
InstantClientPackage-SQL*Plus包含sqlplus和需要的库文件
InstantclientPackage-SDK使用InstantClient开发Oracle应用程序需要的头文件及示例makefile
Instantclientpackage-ODBC使用odbc时需要的库,不是所有平台都有.linux平台包含.
Basic和BasicLite两个中必须选一个,其他包都是可选的.我下载了Basic,JDBCsupplement,SQL*Plus,SDK,ODBC.解压后放在一个文件夹下,在这个文件夹下建立文件tnsnames.ora,设置环境变量LD_LIBRARY_PATH和TNS_ADMIN指向解压后的目录,就可以使用sqlplus了.
我下载的instantclient版本为11.1,测试了联接到oracle9.2.0.4和oracle10.2.0.1.InstantClient中不包含tnsping,exp/imp,rman,netca等工具.如果需要这些工具则需要安装oracleclient。现在明白InstantclientPackage-Basic提供OCCI的库文件,InstantclientPackage-SDK是OCCI的头文件及例子。
2.安装过程:
从http://www.oracle.com/technology/software/tech/oci/instantclient/下载以下文件:oracle-instantclient-sqlplus-11.1.0.1-1.i386.rpm
oracle-instantclient-basic-11.1.0.1-1.i386.rpm
1>安装oracle 11 client
#rpm -ivh oracle-instantclient-sqlplus-11.1.0.1-1.i386.rpm
#rpm -ivh oracle-instantclient-basic-11.1.0.1-1.i386.rpm
2>配置libs
#vi /etc/ld.so.conf
———————————————-/usr/lib/oracle/11.1.0.1/client/lib/———————————————-#ldconfig
ldconfig是一个动态链接库管理命令,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. 它是程序运行所需的动态连接库的配置文件。
3>运行测试[root@localhost sdk]# sqlplus /nologSQL*Plus: Release 11.1.0.6.0 – Production on Wed Jan 30 09:44:34 2008Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL>
4>sqlplus远程连接命令语法
#sqlplus user/pass@”(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.50.10)(PORT = 1521)) )(CONNECT_DATA = (SID = oraclesid)))” [as sysdba]
# sqlplus user/pass@//host:port/sid [as sysdba]
# sqlplus user/pass@host:port/sid [as sysdba]
# sqlplus userid/pwd@database.company.com:1521/sid [as sysdba]
在/usr/lib/oracle/下增加和编辑文件tnsnames.ora:
Orasvr2=
(DESCRIPTION=
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.82)(PORT = 1521))
(CONNECT_DATA=
(SERVER = DEDICATED)
(SERVICE_NAME =ora9i)
其中:ORASVR2:数据库的事例名
192.168.1.82数据库服务器地址
ora9i:数据库名
数据库连接方式:
根据你的连接方式决定是否配置tnsnames.ora。 如果用user/pwd@sid这种本地名称解析方式连接,就需要配。 如果用user/pwd@ip:port/sid这种ezconnect方式连接,则不需要配。
即时客户端:所以如果想用本地名称解析的话,就新建tnsnames.ora文件,位置自己决定,不过要设置环境变量TNS_ADMIN对应到它的目录。
我在安装完 oracle-instantclient-sqlplus-11.1.0.1-1.i386.rpm后直接输入:sqlplus system/8823@172.16.100.101:1521/OS101
5>解决linux中sqlplus退格显示乱码。
在linux环境下使用sqlplus,在回删(backspace)时往往会出现 一串的乱码。出现乱码是由于oracle的sqlplus不使用gnu的readline库造成的。
解决方法有两种:
1。要使用回删键(backspace)时,同时按住ctrl键
2。设定环境变量
在bash下:$ stty erase ^? 或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H 或者把 stty erase ^H 添加到.cshrc中。
3.安装完之后我们可以运行OCCI的例子,但在这其中发生了很多的问题:
我以开始下的是ORACLE10i的编译时总错,我的LINUX子带的库比它高,所以我又改有ORACLE11这回就好了。
ln -s libclntsh.so.10.1 libclntsh.so
ln -s libocci.so.10.1 libocci.so
两个连接必须要做的。ln -s则是软链接,也就是windows下快捷方式的概念。
设置ld_library_path它是运行时加载动态库的环境变量,
export ld_library_path=/usr/lib/oracle/11.1/client/lib
你也可以在这里设置就不用总设了:
编辑文件/root/.bash_profile文件,增加以下内容:
PATH=$PATH:$HOME/bin:/usr/lib/oracle
LD_LIBRARY_PATH=$ LD_LIBRARY:/usr/lib/oracle
SQLPATH=/usr/lib/oracle
TNS_ADMIN=/usr/lib/oracle //新建tnsnames.ora文件所在地。
NLS_LANG=”Simplified Chinese_China.ZHS16GBK” //汉语export PATH LD_LIBRARY_PATH SQLPATH TNS_ADMIN
unset USERNAME
-Wl,-rpath=./ 表示在./目录(即当前目录)寻找库文件
但还有问题:
1. [root@localhost sdk]# g++ -o occidml.o occidml.cpp -I/usr/include/oracle/ -L/usr/lib/oracle/lib/ -locci -lclntsh
/usr/bin/ld: warning: libaio.so.1, needed by /usr/lib/oracle/lib//libclntsh.so, not found (try using -rpath or -rpath-link)
这时你按个libaio的库就可以了。
2. [root@localhost sdk]# ./occidml
./occidml: error while loading shared libraries: /usr/lib/oracle/lib/libnnz11.so: cannot restore segment prot after reloc: Permission denied
这个问题可就麻烦了,一开始不懂,尝试先生成.o文件,再连接成可执行文件,可还是不行。
原来是SElinux的事:
[root@localhost sdk]# chcon -t texerl_shlib_t/usr/lib/oracle/lib/libnnz11.so
chcon: too few arguments
请尝试执行“chcon –help”来获取更多信息。
还是不行,不懂chcon是干嘛的,上网看最后知道
解决办法:
chcon /usr/lib/oracle/lib/libnnz11.so -t shlib_t
原因是Linux有一个SELinux保护模式引起的。
关闭SELINUX的方法:
vi /etc/selinux/config 将SELINUX=enforcing 改成SELINUX=disabled 保存,重起电脑即可.
FC5 中的SELinux 代表了用户,程序以及进程间相互交流的主要变化。
最后运行还是不行:error: ORA-12162: TNS:net service name is incorrectly specified
没辙了,我觉的是我没在本机上装数据库所以有OCCI提供的连数据库的函数createConnection是不行的,因为它是连接本地数据库的,连接远程数据库要用别的函数,这个还在查找中。
但现在解决了,就是在代码中用ezconnect方式连接:system/8823@172.16.100.101:1521/)OS101,这样就好了。
以上是我在linux下连接远端数据库的过程,希望对大家有帮助。
不要因为生活琐事而烦恼,不要因为儿女情长而忧愁,