最開始一次給客戶作優化設置的時候,出現過一個這樣的錯,那時候沒有經驗,數據庫怎麼都起不來,本身嚇得不行了,回來幸虧找到一個有經驗的前輩,才得以解決。
時間幾年過去了,再也沒有發生,這幾天突然想起一塊兒那次的事,不禁的想把當時的狀況模擬出來,本身來處理一次叻。
問題是怎麼出現的,
首先在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’;
重啓服務,便可。數據庫