out of memory解決實例

最開始一次給客戶做優化設置的時候,出現過一個這樣的錯,那時候沒有經驗,數據庫怎麼都起不來,自己嚇得不行了,回來幸好找到一個有經驗的前輩,才得以解決。

時間幾年過去了,再也沒有發生,這幾天忽然想起一起那次的事,不由的想把當時的情況模擬出來,自己來處理一次叻。

問題是怎麼出現的,

首先在32位機器上,配置sga的內存超過1.5G,基本上就出現這個問題叻

這裏還有一點要知道,sga_max_size可以自動來變動的,當sga的內存組件的和小於sga_max_size的時候,sga_max_size不會改變,還是維持自己的值,如果超過了這個和,sga_max_size的就會自動變動成和的值,這個你可以自己試試。

看看我的內存情況

Total System Global Area 965812724 bytes

Fixed Size 455156 bytes

Variable Size 251658240 bytes

Database Buffers 713031680 bytes

Redo Buffers 667648 bytes

這是我的windowxp上的實例,

我現在想調整database buffer的值到1G,我只需要設置db_cache_size到1G,而不設置sga_max_size,這時由於各組件值大於sga_max_size目前值,所以sga_max_size自動變化。

SQL>alter system set db_cache_size=1000M scope=spfile;

SQL> shutdown immediate;

SQL> startup;

看看現在的內存信息

Total System Global Area 1301357848 bytes

Fixed Size 455960 bytes

Variable Size 251658240 bytes

Database Buffers 1048576000 bytes

Redo Buffers 667648 bytes

發現sga_max_size已經自動變化

SQL> show parameters sga_

NAME TYPE VALUE

———————————— ——————————— ———

sga_max_size big integer 130135784

也已經變化叻。



現在模擬我們的問題吧

不過模擬前,先把我們的init.Ora備份一下,不備份init.Ora當然也不可以不過,等下恢復設置的東西太多,麻煩。

先把我們調整內存錢的parameter備份一下吧

SQL>create pfile=’F:\Synchrophy\Server\oracle\admin\ORA9i\pfile\init.bak.ora’ from spfile;

這句話就是把你的spfile備份到pfile文件裏,由於spfile是二進制的文件,不好修改,所以我們一般用這樣的形式來備份。

備份好。我們可以放心的改我們的內存叻

SQL> alter system set db_cache_size=1500M scope=spfile;

SQL> shutdown immediate;

SQL> startup;

現在問題出現了吧

一起看看

ORA-27102: out of memory

OSD-00022: Message 22 not found; product=RDBMS; facility=SOSD

O/S-Error: (OS Not enough storage is available to process this command.

爲什麼會出現這樣的問題叻,是因爲在32位的機器上Oracle的內存有限制,內存最大4G,32位留50%給操作系統,window是單線程的,不能超過1.7G。out of memory也就出來叻。

那麼碰到這個問題我們如何解決了。如果瞭解Oracle的init的啓動的話,做這個恢復就比較簡單了,默認oralce是從spfile先啓動的,

你可以這樣查到路徑

SQL> show parameter pfile



NAME TYPE VALUE

———————————— ———– ——————————

spfile string %ORACLE_HOME%\DATABASE\SPFILE%

 ORACLE_SID%.ORA

所以你先在可以通過修改這個文件裏的相關參數的值來恢復,不過修復的時候注意,這是個二進制文件,要保持二進制的格式。

還有方法用我們剛纔的pfile來恢復。

SQL>startup pfile=’你備份的init.ora’;

如果在window下,需要

SQL>create spfile from pfile=’你備份的init.ora’;

重啓服務,即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章