linux上安裝oracle

hzh_hu發表於2006-01-05

我在RedHat7.1上第一次安裝Oracle8.1.7就成功了,呵呵,很幸運!後來有不少朋友請教我安裝方法,我才知道原來有這麼多問題,按照我的方法應該可以安裝成功,我自己安裝了不下10遍都是很順利就成功了。總結一下自己的安裝經驗,也總結一下別人遇到的問題,希望能對其他人有一點點幫助。
安裝假設oracle系統檔案放在/u01下,資料庫檔案放在/u02下,不安裝OPS,不安裝JServer,單資料庫單例項。
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/8.1.7
ORACLE_SID=orcl

一、安裝前的配置

1、替換glibc
Oracle8.1.7使用的是glibc2.1.3,而RedHat7.1是用的glibc2.2.2,不相容,所以要替換glibc才能成功安裝。
首先要安裝RedHat7.1安裝光碟上的幾個以compat開頭的rpm包,它們是:
compat-glibc-6.2-2.1.3.2.i386.rpm
compat-egcs-objc-6.2-1.1.2.14.i386.rpm
compat-egcs-6.2-1.1.2.14.i386.rpm
compat-libs-6.2-3.i386.rpm
可以把:
compat-libstdc++-6.2-2.9.0.14.i386.rpm
compat-egcs-c++-6.2-1.1.2.14.i386.rpm
也安裝上。
因為這幾個軟體包之間有依賴關係,如果安裝順序不對,會報錯的,無法安裝。一般來說應該先安裝第一張上的兩個,再安裝第二張上面的四個。
如果這樣做也報錯,安裝不上,可以先把這6個軟體包複製到一個目錄下,然後再一起安裝,這樣就不用怕它們之間的依賴關係,一定可以安裝成功了。例如:
rpm -ivh compat-glibc-6.2-2.1.3.2.i386.rpm compat-egcs-6.2-1.1.2.14.i386.rpm compat-libs-6.2-3.i386.rpm compat-egcs-c++-6.2-1.1.2.14.i386.rpm compat-egcs-objc-6.2-1.1.2.14.i386.rpm compat-libstdc++-6.2-2.9.0.14.i386.rpm

2、建立使用者和組
groupadd dba
useradd oracle -g dba
passwd oracle
Oracle安裝文件上說,要建立兩個組,oinstall和dba,oracle使用者主屬組是oinstall,從屬組是dba,其實只用dba就好了,不要那麼麻煩。
chown -R oracle.dba /u01
chown -R oracle.dba /u02

3、設環境變數
可以將要設的環境變數放在oracle使用者主目錄下的.bash_profile中,也可以放在/etc/profile中,對所有的使用者可見,我建議放在/etc/profile中,因為凡是在本機執行的程式讀寫本機的Oracle資料庫,一般都需要設Oracle的環境變數,否則無法連線資料庫。
我可以舉一個例子:
如果你的WEB Server,例如Apache,需要讀寫資料庫,提供網頁的動態內容,假設用PHP或者JSP,又或者Perl等等來寫ServerAPI或者CGI,因為Apache是以root啟動一個程式,這個程式再fork若干子程式以nobody使用者執行,響應80埠的http請求,所以如果在root讀不到Oracle環境變數,Web程式根本無法讀寫資料庫。只要root讀到oracle環境變數,fork子程式的時候,複製了父程式的資料空間,也繼承了父程式的環境變數,所以可以讀到oracle變數,就可以讀寫oracle資料庫了。
所以我這樣設定,在/etc/profile中新增如下行:
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/8.1.7
ORACLE_SID=orcl
ORA_NLS=/u01/app/oracle/product/8.1.7/ocommon/nls/admin/data
NLS_LANG="SIMPLIFIED CHINESE"
CLASSPATH=.:/u01/app/oracle/product/8.1.7/jdbc/lib/classes111.zip
LD_LIBRARY_PATH=/u01/app/oracle/product/8.1.7/lib
PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/dbs:/etc
export ORACLE_BASE ORACLE_HOME ORACLE_SID ORA_NLS NLS_LANG LD_LIBRARY_PATH PATH

其中$ORACLE_BASE,$ORACLE_HOME指定安裝目錄,$ORACLE_SID是oracle資料庫的SID,$ORA_NLS是字符集目錄,$NLS_LANG是字符集,$CLASSPATH是Java程式讀寫資料庫需要的JDBC的class,前面加個點號是先搜當前目錄的意思。$LD_LIBRARY_PATH是Oracle的C庫函式和標頭檔案的位置,對於OCI8,PROC和JDBC的OCI連線是必須的。

登出再登入,或者不用登出,執行下一行的命令,直接讀一下/etc/profile
. /etc/profile


env|grep oracle
看看oracle的變數是否都設定正確。

4、臨時更改glibc

. /usr/i386-glibc21-linux/bin/i386-glibc21-linux-env.sh
export LD_ASSUME_KERNEL=2.2.5

加入oracle主目錄(/home/oracle)下的.bash_profile,登出再以oracle登入,或者不用登出,執行下一行的命令,直接讀一下.bash_profile
. /home/oracle/.bash_profile

再看看是否已替換
gcc -v
替換之前是:
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81)
替換之後是:
Reading specs from /usr/i386-glibc21-linux/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc driver version 2.96 20000731 (Red Hat Linux 7.1 2.96-81) executing gcc version egcs-2.91.66

5、修改核心引數
Oracle資料庫執行的時候,用共享記憶體來實現Oracle的SGA,所以要調整一下Linux的核心引數來適應Oracle的SGA的要求,這個方面到底要調整到多少才適合,可以參考Oracle官方的安裝文件。一般而言,主要就是共享記憶體段最大尺寸要調整,Linux核心預設共享記憶體段最大尺寸是32M,如果Oracle SGA開的大於32M(一般商業執行,肯定大於32M),SGA就會分段,佔據幾個不連續的共享記憶體段,造成Oracle的效能下降。
命令ipcs -al可以檢視共享記憶體引數,命令ipcs檢視共享記憶體使用情況。
修改核心引數可以修改核心原始碼再重新編譯核心,這個方法有點麻煩,關於共享記憶體的引數在原始碼目錄下的include/linux/下的shm.h和sem.h檔案中。
另一個簡單的辦法是直接修改核心引數,即修改/proc下的檔案,立即生效。
可以修改/proc/sys/kernel下的shmmax和sem
shmmax是以位元組記的共享記憶體段的最大尺寸,
shmmni是共享記憶體段的最大數量
shmmax是共享記憶體總共最大容量(shmmax*shmmni)
sem是訊號量引數,msgmax,msgmnb,msgmni是訊息佇列的引數。

我改動如下:

echo 134217728 > /proc/sys/kernel/shmmax (SGA最大為128M)
echo -e "250 32000 100 128" > /proc/sys/kernel/sem
(其實也不用改這項,只是將max ops per semop call改大了,這是Oracle的安裝文件上寫的,我就這麼做了,不過我試過,不改也沒事,其他都保持原來的,沒有改)

總結如下:改一項必須的shmmax,其他的我在使用過程中,引數都夠大了,不需要再調整。

二、安裝過程

1、runInstaller啟動安裝介面
有的時候runInstaller,安裝介面不出來,這主要還是因為Oracle的字符集設為了簡體中文,但OS是英文的,所以有時候出不來,用Java寫的程式經常出現字符集的問題。此時臨時銷燬$NLS_LANG變數,Java會用預設的字符集,就好了。所以:

unset $NLS_LANG

也可以試試

unset $LANG
× 其實dbassist也是有時候出不來的,這樣做就可以出來了,但是netasst始終出不了,不清楚為什麼,不過可以自己修改lisener.ora和tnsnames.ora,所以netasst也不是必須的。

另一個可能的原因就是glibc沒有替換好,我發現直到JDK1.3.1_01,才支援glibc2.2,之前的版本,包括JDK1.3.0都不支援glibc2.2,只要在glibc2.2下執行,就會出現沒有任何反應,程式好像死亡了一樣的毛病,Oracle安裝程式用的還是JRE1.1.8,所以只要glibc用的還是2.2版的,安裝視窗總不會出來的。


2、下面一路點選下一步,到填寫安裝oracle軟體的屬組的時候,填寫dba就好了,然後提示用root執行$ORACLE_HOME/root.sh,以root登入執行。在/etc/下生成一個檔案oraInst.loc

3、到選擇安裝“伺服器”,“網路管理工作站”,“客戶端”的時候,選擇“伺服器”
安裝好以後,可以再回到這個畫面來選擇別的沒有安裝的元件,也隨時可以啟動runInstaller來安裝別的元件。
另外有人提到沒有安裝PORC的選項,其實PROC是在“客戶端”的選項裡安裝的。

4、然後選擇“定製安裝”,不要選擇典型安裝,因為典型安裝會安裝Oracle Jserver,實際上不太用到Jserver,而且安裝Jserver是在SGA裡要啟動一個Java虛擬機器,非常消耗資源(Java的東西總是很吃資源的),而且安裝的時候建立Jserver的過程非常的漫長,一度令我懷疑當機了。

5、出現選擇安裝元件的列表,可以自己增刪一些元件,我不需要oracle的Apache Server,準備自己從原始碼安裝,所以就勾掉了。如果要安裝Apache Server的選項話,要預先安裝Java,並設定$JAVA_HOME變數,雖然要求的是jdk1.1.8,不過用jdk1.3也完全可以安裝成功,執行Apache也沒有什麼問題,至於會不會因為jdk的版本不同導致一些程式執行結果的差異,我就沒有測試過了。

6、還是選擇安裝元件的列表這個介面,有個選擇語言的按鈕,增加“簡體中文”

7、詢問是否建立資料庫,“是”,添上安裝資料庫的SID,我的是“orcl”,資料庫資料檔案的存放目錄,我的是“/u02“。

8、開始安裝Oracle,安裝程式複製檔案。
有很多人說,複製檔案完後,聯接系統庫函式的時候,出現make錯誤,我想這多半還是替換glibc不成功導致的吧,我安裝的時候確實沒有出現過這樣的問題。我想按照我寫的步驟來,應該不會出現這樣的問題的。

9、完成後,提示以root執行root.sh。
Oracle8.1.7有兩個版本,一個是Oracle8.1.7.0.0,另一個是Oracle8.1.7.0.1,這個版本帶OPS,而且Oracle提供了一個glibc2.2的patch,不過在Redhat7.1上,按照上面方法做了以後,實際上不需要打補丁的。這個Oracle8.1.7.0.1的版本此時的root.sh有個bug,應該在第156行,如下:
RUID=`/usr/bin/id|$AWK -F( '{print $2}'|$AWK -F) '{print $1}`
在最後少寫個‘
應該改為:
RUID=`/usr/bin/id|$AWK -F( '{print $2}'|$AWK -F) '{print $1}'`

執行它,生成/etc/oratab。

10、自動啟動netasst,配置監聽器,一般如果為了省事,選典型配置就可以了,只不過典型配置開啟了一個2481埠,是JServer用的,如果不用JServer的話,也可以不要它,現在可以不用管它,回頭再改listener.ora好了。

11、自動啟動dbassist,安裝資料庫,按照提示做就是了,根據自己的情況可以適當的調整安裝資料庫時的引數,最後開始建立資料庫,此時也可以選擇先儲存建立的指令碼,再退出dbassist,單獨執行建立指令碼,這樣更靈活一些,可以自己改建立指令碼,也可以自己研究一下指令碼,會有收穫的。

三、安裝後配置

1、以root登入,修改/etc/oratab,將最後的:
orcl:/u01/app/oracle/product/8.1.7:N
改為:
orcl:/u01/app/oracle/product/8.1.7:Y
這樣就可以用dbstart和dbshut來啟動和關閉資料庫了,不用自己寫指令碼調svrmgrl。

2、將資料庫啟動命令和修改核心命令放在系統啟動指令碼中

修改/etc/rc.d/rc.local,加入:

#modify kernel parameter
echo 134217728 > /proc/sys/kernel/shmmax
echo -e "250 32000 100 128" > /proc/sys/kernel/sem

#start Oracle8.1.7
su - oracle -c 'lsnrctl start'
su - oracle -c 'dbstart'

我比較懶,沒有另外寫指令碼聯接進rc3.d,rc0.d.rc5.d,rc6.d了,而是直接放在rc.local中了,呵呵
注意的是修改核心引數必須在啟動資料庫例項之前,啟動資料庫後,用ipcs 命令看看共享記憶體的使用情況,如果沒有分段就行了。

另外一個特別要說明的事情是一定要注意,凡是讀寫資料庫的程式,必須取得oracle的環境變數,否則無法聯接資料庫。
上面的指令碼中su - 中的這個"-"非常講究,它的意思是切換到oracle使用者,並取得oracle的環境變數。
再例如,如果還要啟動apache來讀寫資料庫的話,rc.local加入的命令就一定要這樣寫:
#start apache httpd server
. /etc/profile
/usr/local/apache/bin/apachectl start

因為我把oracle的環境變數放在/etc/profile裡了,在啟動apache之前要先強制它讀/etc/profile,取得oracle的環境變數,這樣apache的ServerAPI程式就可以讀寫資料庫了。

3、修改Net8配置,可以用netca,或者自己修改$ORACLE_HOME/network/admin下的listener.ora和tnsnames.ora,netasst好像出不來。

4、如果建立第二個例項,用dbassist就好了,如果dbassist出不來的話,臨時銷燬$LANG,$NLS_LANG
unset $NLS_LANG
unset $LANG
就可以出來了。



四、廢話

我沒有足夠的硬體條件來安裝OPS,所以安裝Oracle8.1.7的時候不選OPS的;也沒有硬體條件安裝Oracle9i,所以不知道RedHat7.1來安裝Oracle9i如何。不過用過一下SuSE7.1,印象很好,既然Oracle官方推薦是SuSE的話,還是用SuSE來安裝Oracle9i吧,這樣相容性比較好,也省事。
如果我寫的安裝方法有什麼謬誤的地方,請大家指點一下,謝謝!
我的聯絡方法:
E-mail:
QQ: 14477412'


補充說明:2001年9月16日

本質來說,RedHat7.1的glibc2.2庫和其他相關工具對於Oracle8i來說,是有一點高了。所以一般都要用RedHat7.1自帶的相容RedHat6.2的庫替換一下,也就是glibc2.1.3。
我自己的經驗是隻要正確替換了glibc,就一定可以安裝成功,不用做別的工作。一定要把那幾個compat的rpm軟體包安裝好,正確替換,再用gcc -v試試,確定是在用compat glibc2.1.3,再開始安裝。
我在這個帖子裡沒有提設DISPLAY變數的問題,其實如果在本機的X下安裝oracle,會有預設設定的,根本不需要自己再設了。
如果runInstaller報DISPLAY出錯的話,就自己設一下好了,無非就是
export DISPLAY=192.168.0.1:0.0 (假設IP是192.168.0.1)
如果這樣做了,聯接系統庫的時候還報make錯誤的話(我是從來沒有遇到這樣的make error問題,所以沒有辦法測試),可能就不是glibc的問題,而是ld這些命令的版本問題了。我建議如果出現這種錯誤的話,試試這個方法,就是再降級binutil。
先下載binutils-2.10.0.18-1.i386.rpm(下載網址:
rpm -Uvh binutils-2.10.0.18-1.i386.rpm --force --nodeps
然後再runInstaller。
又或者雖然出現make error,但是畢竟可以複製檔案安裝過去的話,也可以試試這個方法:
在安裝檔案完成以後,會先後出現配置Net8和出現資料庫助手建立資料庫的過程。
(如果配置Net8出錯的話,可以就這樣退出,自己手工修改$ORACLE_HOME/network/admin下的listener.ora和tnsnames.ora。)
在出現資料庫助手建立資料庫的時候,不要建立資料庫,退出。因為此時聯接的可執行程式有問題,不能正確建立資料庫。
到Oracle網站,在下載Oracle8.1.7的地方,可以找到一個glibc的patch:

把它下載,放到$ORACLE_HOME下,解壓縮,
cd $ORACLE_HOME
tar xvfz glibc-2.1.3-stubs.tar.gz
./setup_stubs.sh
然後在
dbassist
啟動資料庫建立助手,建立資料庫。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/95530/viewspace-812811/,如需轉載,請註明出處,否則將追究法律責任。

相關文章