【拖雷】一則ORA-12500錯誤的解決案例

idba發表於2008-04-16

環境:

OS:AIX 5.3
$oslevel -s
5300-06-04-0748
DB:Oracle 9206

我們的一臺生產環境,突然系統監測到大量的連線失敗,通過監聽的日誌,可以發現部分連線是成功的,部分連線是失敗的。如

成功的連線

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=shop48.cm2)(USER=admin))) * (ADDR
ESS=(PROTOCOL=tcp)(HOST=172.19.26.48)(PORT=49288)) * establish * feel * 0

失敗的連線

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=app131)(USER=admin))) * (ADDRESS=
(PROTOCOL=tcp)(HOST=192.168.60.131)(PORT=55076)) * establish * feel * 12500
TNS-12500: TNS:listener failed to start a dedicated server process
TNS-12540: TNS:internal limit restriction exceeded
TNS-12560: TNS:protocol adapter error
TNS-00510: Internal limit restriction exceeded
IBM/AIX RISC System/6000 Error: 12: Not enough space

失敗的連線反饋給前端的錯誤是Ora-12500錯誤,系統級別的錯誤是internal limit restriction exceeded,以及錯誤12:Not enough space。通常,AIX的錯誤12都是指記憶體不夠,但是這個系統的總記憶體是64G,還存在大量剩餘空間,交換空間的使用率也不超過2%。
開始以為是連線數與檔案控制程式碼的限制,但是修改了系統引數maxuproc(每使用者的最大程式限制)從2000到5000(系統當時實際使用的程式數小於1000個),使用者檔案控制程式碼限制ofiles(descriptors)從4000到5000,都沒有效果。
根據錯誤型別12,還是把問題定位在記憶體上面,檢視SGA大小,佔了45G,約系統總記憶體的70%,加上系統自身要消耗10%的記憶體,合計80%的記憶體,這部分記憶體是不能交換的,而OS的系統引數maxpin%正好預設是80%,修改maxpin%到90%,問題解決,所有的連線正常。
正常情況下,系統的記憶體分計算記憶體與非計算記憶體(如檔案系統cache),SGA與系統的這部分記憶體都屬於計算記憶體,在AIX的早期版本(如Aix 5.2),如果記憶體不夠,這部分記憶體是可以交換的,但是後期的版本,如Aix 5.3以後,因為large page的引進,這部分記憶體是長駐記憶體而不能交換的(不知道是進步還是退步)。所以,當這部分記憶體達到maxpin%的時候,就會發生記憶體不夠,如果超出,就會發生系統hang住,所有的連線都無法進入,我們的這個實際案例是幸運的,只是在臨界點附近顛簸,並沒有引起系統的癱瘓。
修改maxpin%是一個解決方法,但同時也要注意maxperm%,maxclient%與minperm%的正確設定,以及其它記憶體的使用,因為除了系統以及SGA之外,還有程式空間(程式使用記憶體,有一部分是可交換的,有一部分也是屬於系統級別,不可交換的),以及檔案系統Cache,設定lru_file_repage=0,可以保證在minperm%之上,優先交換非計算記憶體。
至於剛上線的時候是正常的,為什麼執行一段時間以後才不正常,可能是因為連線數的增加,導致系統消耗以及記憶體增加,慢慢的達到了臨界點。

<!--

--EOF--

Trackback:http://rdc.taobao.com/blog/dba/html/131_oracle-aix-error-12500.html/trackback

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

相關文章