正在使用的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連接上數據庫(出現這個錯誤後,數據已經無法正常訪問,需要請停止數據庫服務,然後再重新啓動),執行如下命令:
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;
//上面語句如果執行出錯,暫不理會,等下面語句全部執行完後,重新啓動oracle service,再次執行這條語句。
alter system set sga_max_size=1200m scope=spfile;
3. 設置使用內存最大大小
alter system set large_pool_size=80m;
4. 重啓oracle service。
5. 查看sga,pga,pool的大小。
show parameter pool
可參考原文:http://blog.csdn.net/zhangout/article/details/6454794