今天中午將近12點的時候突然收到短信告警提示,公司的軟件長時間沒有話單產生。第一反應是公司的軟件掛掉了,所以立即進行了查看。重啟了所有軟件之後發現居然沒有回復正常,一直提示:
com.gs.db.DBException: java.sql.SQLException: Io 異常: The Network Adapt
er could not establish the connection。
以為是數據庫停掉了,故去了plsql進行了登錄,此時發現plsql輸入用戶名密碼之後無響應。
難道是監聽掛掉了?去數據庫服務器本機登錄試試,抱著這種想法去了數據庫服務器上,使用sqlplus進行登錄,發現sqlplus居然也登錄不上。
哎呀我去~~邪了啊。會不會是連接太多了,把軟件跑死了,嘗試停止監聽已斷開所有連接,結果也是長時間無響應。去看了一下內存占用率和CPU占用率終於發現了問題所在。
內存還好沒看出什麼特別的地方,可是CPU就不正常了,占用率居然是100%。
由於無法登錄數據庫,故此無法使用常規的方式重啟數據庫軟件,故此只好選擇了重啟數據庫服務器。重啟了之後雖然能夠正常使用了,但是心中還是耿耿於懷想找到無響應和CPU占用率100%的原因,通過在網上找資料,終於發現原來這是一個oracle的bug。Oracle版本是10.2.0.1。只要Linux x86主機運行天數是是24.8的倍數都有可能引發該bug(剛剛好系統運行的時間是198天),因為time()函數值為null,造成無限死循環,從而耗盡cpu,我的服務器剛好有這個問題。
該Oracle BUG的解決方法如下:
解決辦法三種:
1)重啟主機;
2)打patch set,如升級到10.2.0.4;
3)對該bug單獨打臨時patch 4612267。
第一種治標不治本,臨時用用可以,但是不從根本上解決問題;第二種從根本上解決問題,但是需要重新安裝數據庫,費時費力;第三種最省事,但是需要停業務安裝補丁,並且有沒有人好心免費給你補丁還是回事。本人運氣好找到了oracle對應的補丁,還好下載的代價不是很高,不然要哭死。
得到補丁之後按著手冊上和網上的教程總結了如下的安裝步驟:
停止所有數據庫服務,一般來說就這三種
1、停止監聽:lsnrctl stop
2、停止dbconsole:emctl stop dbconsole(你要是安裝了就停,沒安裝不用管它)
3、停止數據庫:shutdown immediate
使用root用戶登錄linux系統,建立一個文件夾存放補丁文件,名稱例如patch。建立完成之後將補丁上傳上去。
然後解壓縮:
解壓縮之後會看到一個4612267的目錄,此時不要直接進行安裝。
切換到oracle用戶之後進入此目錄,會看到有兩個文件夾一個文件。
其中文件夾裡面就是具體的升級文件了,那個txt就是一個描述文件,可以不用管它。在這個目錄下執行patch apply命令開始安裝補丁:
執行成功之後會提示如下信息:
此時他會詢問是否准備打補丁,這裡我們選擇y,輸入之後回車就可以看到安裝過程了。
到這裡補丁安裝完畢,此時我們需要驗證一下補丁是否安裝成功。使用opatch lsinventory命令查看補丁是否安裝成功:
看到補丁號就說明我們安裝成功了。
如果有一天因為某些原因不需要這個不定了,我們也可以卸載掉。
進入補丁所在的目錄,執行以下命令:
$ORACLE_HOME/OPatch/opatch rollback -id 461226
然後一路y就行了。
本文中所涉及到的環境如下:
Linux
Linux hljtnitsdb 2.6.18-128.el5PAE #1 SMP Wed Dec 17 12:02:33 EST 2008 i686 athlon i386 GNU/Linux
Oracle
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0