轉載: http://blog.csdn.net/zhangout/article/details/6454794
http://www.readern.com/tag/ora-04030
正在使用的oracle 11g數據庫,前天在用一段時間后(開始要較長時間才出現,后來較短時間就出現),頻繁報ORA-04030錯誤,具體錯誤信息是 ORA-04030: 在嘗試分配...字節(...)時進程內存不足。
根據異常信息,可以很容易的判斷是由於內存使用過多,分配不足所致的,但是電腦本身內存並不小,由此可以說明oracle在分配內存時,應該是有限制的,當超出這個限制的時,就會出現這個錯誤。
在網上查了一下,挺多人遇到這個問題,根據自己的實際問題及解決過程,個人認為下面的說法更准確:
另外值得注意的是max_sga_size和sga_target的設置:
max_sga_size指的是可動態分配的最大值﹐而sga_target是當前已分配的最大sga。
max_sga_size是不可以動態修改的﹐而sga_target是可動態修改﹐直到max_sga_size的值(前提是你設定的max_sga_size>sga_target的情況)
如果在實例啟動時﹐max_sga_size < sga_target或max_sga_size沒設定﹐則啟動后max_sga_size的值會等於sga_target的值,這時如果內存占用超過sga_target,也可能會出現ORA-04030的錯誤。
具體解決辦法可參考,使用pl/sql或sqlplus連接上數據庫(出現這個錯誤后,數據已經無法正常訪問,需要請停止數據庫服務,然后再重新啟動),執行如下命令:
ORA-04030: out of process memory when trying to allocate 1049100 bytes (KSFQ heap,KSFQ Buffers)
1. 官方的描述如下
ORA-04030 out of process memory when trying to allocate string bytes (string,string)
Cause: Operating system process private memory has been exhausted.
Action: See the database administrator or operating system administrator to increase process memory quota. There may be a bug in the application that causes excessive allocations of process memory space.
這使我想起我當初在安裝數據庫時分配的內存可以過大,下圖是我安裝的配置:
安裝后的oracle的內存分配如下圖:(large_pool_size原來是0,后來修改到800M)
通過sql命令查看得知sga_target=1800M,pga_aggregate_target=600和我設置的一致,對於Share Memory Management設為automatic,oracle的說法是oracle會自己自行管理,看來是沒有管理好,還得手動分配的好。
2. 網上搜的信息
現象:ORA-04030: 在嘗試分配...字節 (hash-join subh,kllcqas:kllsltba) 時進程內存不足。
ORA-04030:out of process memory when trying to allocate string bytes
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來觀察如何放開限制……
根據以上的2點,確定需要調整內存大小小於1.7G。
1. 設置rman從SGA取內存
alter system set dbwr_io_slaves=2 scope=spfile;
alter system set backup_tape_io_slaves=true scope=spfile;
2. 調整SGA大小
alter system set sga_target=1200m;
alter system set sga_max_size=1200m scope=spfile;
3. 設置使用內存最大大小
alter system set large_pool_size=80m;
4. 重啟oracle service。
5. 查看sga,pga,pool的大小。