linux下oracle instant client安裝和運行

1.首先要知道什麼是ORACLE的客戶端:

Oracle Instant client 是oracle提供的簡便客戶端, 支持多種平臺. 可從oracle網站下載, 下載地址爲
http://www.oracle.com/technology/tech/oci/instantclient/index.html
包括如下內容:
Instant client Package - Basic 運行OCI, OCCI, 和JDBC-OCI應用程序需要的所有文件. 
Instant client Package - Basic Lite: 只包含英語錯誤信息, 只支持unicode, ascii, 西歐字符集. 
Instant client Package - JDBC Supplement  爲jdbc增加了xa, 國際化和RowSet操作.
Instant Client Package - SQL *Plus 包含sqlplus和需要的庫文件
Instant client Package - SDK 使用Instant Client開發Oracle 應用程序需要的頭文件及示例makefile
Instant client package - ODBC 使用odbc時需要的庫, 不是所有平臺都有. linux平臺包含. 
Basic和Basic Lite兩個中必須選一個, 其他包都是可選的. 我下載了 Basic, JDBC supplement, SQL *Plus, SDK, ODBC. 解壓後放在一個文件夾下, 在這個文件夾下建立文件tnsnames.ora, 設置環境變量LD_LIBRARY_PATH和TNS_ADMIN指向解壓後的目錄, 就可以使用sqlplus了. 
我下載的instant client版本爲11.1, 測試了聯接到oracle 9.2.0.4和oracle 10.2.0.1. 

Instant Client中不包含tnsping, exp/imp, rman, netca等工具. 如果需要這些工具則需要安裝oracle client。現在明白Instant client Package - Basic 提供OCCI的庫文件,Instant client Package - 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 /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Wed Jan 30 09:44:34 2008
Copyright (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/[email protected]: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/[email protected]: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的庫就可以了。

ubuntu下可以如下安裝:sudo apt-get install libaio-dev


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/[email protected]:1521/)OS101,這樣就好了。
以上是我在linux下連接遠端數據庫的過程,希望對大家有幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章