最开始一次给客户作优化设置的时候,出现过一个这样的错,那时候没有经验,数据库怎么都起不来,本身吓得不行了,回来幸亏找到一个有经验的前辈,才得以解决。
时间几年过去了,再也没有发生,这几天突然想起一块儿那次的事,不禁的想把当时的状况模拟出来,本身来处理一次叻。
问题是怎么出现的,
首先在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’;
重启服务,便可。数据库