在RedHat7.1上安裝Oracle8.1.7


來源:bbs.ccidnet.com
2002-6-30 10:08:00
 
 

  在RedHat7.1上安裝Oracle8.1.7的經驗談
  
  我在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
  就可以出來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章