轉載: http://blog.csdn.net/zhangout/article/details/6454794java
http://www.readern.com/tag/ora-04030web
正在使用的oracle 11g數據庫,前天在用一段時間後(開始要較長時間纔出現,後來較短期就出現),頻繁報ORA-04030錯誤,具體錯誤信息是 ORA-04030: 在嘗試分配...字節(...)時進程內存不足。
根據異常信息,能夠很容易的判斷是因爲內存使用過多,分配不足所致的,可是電腦自己內存並不小,由此能夠說明oracle在分配內存時,應該是有限制的,當超出這個限制的時,就會出現這個錯誤。
在網上查了一下,挺多人遇到這個問題,根據本身的實際問題及解決過程,我的認爲下面的說法更準確:
sql
另外值得注意的是max_sga_size和sga_target的設置:數據庫
max_sga_size指的是可動態分配的最大值﹐而sga_target是當前已分配的最大sga。
max_sga_size是不能夠動態修改的﹐而sga_target是可動態修改﹐直到max_sga_size的值(前提是你設定的max_sga_size>sga_target的情況)
session
若是在實例啓動時﹐max_sga_size < sga_target或max_sga_size沒設定﹐則啓動後max_sga_size的值會等於sga_target的值,這時若是內存佔用超過sga_target,也可能會出現ORA-04030的錯誤。oracle
具體解決辦法可參考,使用pl/sql或sqlplus鏈接上數據庫(出現這個錯誤後,數據已經沒法正常訪問,須要請中止數據庫服務,而後再從新啓動),執行以下命令:app
ORA-04030: out of process memory when trying to allocate 1049100 bytes (KSFQ heap,KSFQ Buffers)spa
1. 官方的描述以下.net
ORA-04030 out of process memory when trying to allocate string bytes (string,string)orm
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的大小。