最开始一次给客户做优化设置的时候,出现过一个这样的错,那时候没有经验,数据库怎么都起不来,自己吓得不行了,回来幸好找到一个有经验的前辈,才得以解决。时间几年过去了,再也没有发生,这几天忽然想起一起那次的事,不由的想把当时的情况模拟出来,自己来处理一次叻。问题是怎么出现的,首先在32位机器上,配置sga的内存超过1.5G,基本上就出现这个问题叻这里还有一点要知道,sga_max_size可以自动来变动的,当sga的内存组件的和小于sga_max_size的时候,sga_max_size不会改变,还是维持自己的值,如果超过了这个和,sga_max_size的就会自动变动成和的值,这个你可以自己试试。看看我的内存情况Total System Global Area  965812724 bytesFixed Size                   455156 bytesVariable Size             251658240 bytesDatabase Buffers          713031680 bytesRedo 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 bytesFixed Size                   455960 bytesVariable Size             251658240 bytesDatabase Buffers         1048576000 bytesRedo 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 memoryOSD-00022: Message 22 not found;  product=RDBMS; facility=SOSDO/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’;重启服务,即可。

解决方案 »

  1.   

    那个时候,在网上看到有人提到这样的问题,但是没有说到过解决方法的,这是自己后来了解到init的方式以后,自己试验出来的,和大家一起分享一下。在附上一个方法,如果当时忘记备份spfile文件叻,可以用以下方法
    删除%ORACLE_HOME%\DATABASE\SPFILE%ORACLE_SID%.ORA文件,然后启动的时候就会去找$ORACLE_BASE/admin/pfile/init.ora或者$ORACLE_BASE/admin/pfile/init$SID.ora,这两个文件是pfile文件,是文本的,你可以直接修改里面的值,然后重启数据库。记住作为DBA,在做任何修改前,一定要先备份相关文件哟。至少可以恢复到出错时的状态。用这个方法的时候,也注意要先备份一下哟。
    ====================================================================================如果你需要帮助或想和我一起学习的请联系
    联系方式QQ:370140387
    QQ群:  85837884(注明:数据库)
    电子邮件:[email protected]
    网站: http://www.inthirties.com
      

  2.   

    win 2003 enterprise
    win advanced server limited
    等系统下,intel的处理器, 是有办法允许应用程序寻址超过4g内存的------------------------还有,楼主这篇文章基于什么环境的呢?os? oracle version?
    我本机os是xp sp2, oracle 10.2.0.1,测试情况是这样的:SQL> show parameter sga;NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     FALSE
    sga_max_size                         big integer 584M
    sga_target                           big integer 584M
    SQL> alter system set db_cache_size = 1000m;
    alter system set db_cache_size = 1000m
    *
    第 1 行出现错误:
    ORA-32017: 更新 SPFILE 时失败
    ORA-00384: 没有足够的内存来增加高速缓存的大小
    SQL> alter system set db_cache_size = 1000m scope = spfile;
    alter system set db_cache_size = 1000m scope = spfile
    *
    第 1 行出现错误:
    ORA-32017: 更新 SPFILE 时失败
    ORA-00384: 没有足够的内存来增加高速缓存的大小SQL> alter system set sga_max_size = 0;
    alter system set sga_max_size = 0
                     *
    第 1 行出现错误:
    ORA-02095: 无法修改指定的初始化参数--------------------------------------楼主的sga_max_size如何做到自动调整大小的呢?
      

  3.   


    不好意思,我的平台是xp sp2+oracle9.2.0.1.0,不是10g,10g里引入了ASSM的技术,是不需要你调整sga_max_size,share pool,buffer cache的大小的。
      

  4.   


    只需要调整sga_target的大小,10g会根据你的生产运行的实际情况,来自行分配相关的内存指标。
      

  5.   

    ASMM虽然自动调整,但一样可以手动设置shared_pool_size, db_cache_size我主要对下面这段话有疑问:-- 这里还有一点要知道,sga_max_size可以自动来变动的,当sga的内存组件的和小于sga_max_size的时候,sga_max_size 不会改变,还是维持自己的值,如果超过了这个和,sga_max_size的就会自动变动成和的值,这个你可以自己试试。那么,sga_max_size自动变动需要满足哪些条件?
      

  6.   


    是的,不过是如果手工设置了,这几个值将不在会自动伸缩,所以10g里手工配置这是不为推荐的。关于sga_max_size的值自动变,是我在oracle9.2.0.1.0下研究内存配置时做的试验,以前给客户做维护的时候出现一次,后来过很了很久,就回想当时的操作来模拟出错误做一下研究,开始以为是其他组件的和超过了就出错,结果就是出不了错,而且发现sga_max_size小于和的时候,就会自己变化,最后想想,上次维护是给客户做优化,才想到有可能是自己一味的加大内存而导致超过oracle内存限制,这才模拟出那时的错误的。我刚才有试了一次,确实是自动变的哟。我修改的是db_cache_size和db_cache_size。
      

  7.   

    可能是版本的不同缘故吧,呵呵关于asmm,10gR2文档中有这样一段话:
          Database buffer cache (default pool)
          Shared pool
          Large pool
          Java pool
          Streams poolIf these automatically tuned memory pools had been set to nonzero values, those values are used as a minimum levels by Automatic Shared Memory Management. You would set minimum values if an application components needs a minimum amount of memory to function properly.我的理解是,这几个值是最小值,ASMM会在满足minimum的基础上进行自动调整