TOP

[Oracle] ORA-04030及ORA-00600的原因分析解決方法

客戶的Oracle 8.1.6重開機後出現兩個狀況
Oracle ORA-04030及ORA-00600兩個錯誤訊息,DB已開啟,但AP程式無法正常登入

最後在網路上找到的解決方式
http://blog.chinaunix.net/u2/60220/showart_1189884.html

http://www.lslnet.com/linux/f/docs1/i26/big5216527.htm

ORA-04030的出現原因及簡單解決方法

ORA-04030出現的基本都是過多的使用memory造成的
Oracle process使用的內存數量是有一定限制的:
A.對於32 BIT系統,有SGA 1.7G限制
B.某些OS系統本身也有一些內存參數限制
--運行ulimit看看
C. OS系統本身物理內存+Swap的限制

檢查DB使用的
SGA + PGA是否超過上面的限制
SGA包括db_cache,shared_pool,large_pool,java_pool

session的PGA包括
sort_area_size/Hash_area_size/*_area_size或者pga_aggregate_target
還有執行的CODE以及一些data也會佔用空間。

然後再根據情況降低裡面的某些值了,比如db_cache, sort_area_size等
如果是OS系統的某Limited造成的,可以考慮放開限制
man ulimit看看如何放開限制……

有人提到ORA-00600的處理方式為

STAR_TRANSFORMATION_ENABLED從原來的TRUE改為FALSE。
這樣子設定後重新啟動DB!!

不過我沒有試這個,因為我改sort_area_size後DB就可以正常啟動
客戶的sort_area_size設定為65535
我是將 sort_area_size設定和原作者的設定一樣 104857600;

12/23日
客戶的AP程式執行中再次出現ORACLE的ORA-04030錯誤訊息
ORA-04030:out of process memory when trying to allocate 104857600 bytes (cursor work he, QERHJ Bit vector)

(1)利用指令 SHOW SGA 於SQL/PLUS下查看Total System Global Area
(2)發現Total System Global Area已超過SGA 1.7GB的最高限制
(3)且Database Buffers 設定高達1.1GB
(4)
再次修改oracle\admin\act\pfile下的init.ora檔案

修正db_block_buffers將數值降底

sort_area_size 修正為10485760;
sort_area_retained_size 修正為10485760;


重新將Oracle DB shutdown immediate 及 startup
DB及AP程式正常執行!!






Database Buffers 的計算方式為:
Database Buffers = db_block_buffers * db_block_size

SGA 的計算方式為:
SGA=((db_block_buffers*block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

重要名詞:
shared_pool_size (資料庫的共享內存)
db_block_buffers (資料庫的高速緩存)
sort_area_size (Oracle排序區)