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連接上數據庫(出現這個錯誤后,數據已經無法正常訪問,需要請停止數據庫服務,然后再重新啟動),執行如下命令:
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
