oracle sga参数改大后导致数据库启动失败怎么解决?
sga_max_size初始化参数指定实例生命周期中全局区域的最大大小。您可以动态更改影响缓冲区高速缓存,共享池,大型池,java池和流池大小的初始化参数,但仅限于这些大小的总和与sga其他的大小(固定sga,变量sga和重做日志缓冲区)不会超过指定的值sga_max_size。
如果不指定sga_max_size,则oracle将选择一个默认值,该值是初始化时指定或缺省的所有组件的总和。如果确实指定了sga_max_size,并且在数据库初始化时,该值小于为所有组件分配的内存总和(显式地在参数文件中或默认值),那么数据库忽略设置sga_max_size并选择正确的值为这个参数。
通过将sga_target参数设置为非零值来启用自动共享内存管理功能。该参数设置sga的总大小。它取代了控制为一组特定组件分配的内存的参数,这些组件现在可以根据需要自动动态调整大小(调整)。
但是如果sga_max_size的值设置的太大,会导致系统不能分配足够的内存,导致在数据库修改完sga_max_size 参数之后,下次启动数据库会出现
sql> startup nomount; ora-00844: parameter not taking memory_target into account ora-00851: sga_max_size 2147483648 cannot be set to more than memory_target 1040187392.
这种时候,如果你在设置修改spfile设置前,进行了备份的话,可以通过制定之前的备份的spfile进行启动,spfile的默认路径$oracle_home/dbs目录,备份spfile可以直接copy一个副本,也可以生成一个pfile文件
sql>create pfile='pfile path' from spfile;
指定spfile路径进行启动
sql> startup nomount spfile='spfile path'
单单是,如果你改之前既没copy,也没备份,那么真的是悲剧了,不过还是可以从改过的spfile文件里面修改一个pfile,先启动起来在进行参数调整。具体步骤是
1、 把spfile赶紧做个备份,虽然现在的spfile不能用,但是,如果连这个不能用的也丢了的话,那真是困难了。
2、把当前的spfile改成名称init+实例名.ora 例如实例名是orcl 就改成initorcl.ora,大写的orcl就改成initorcl.ora
3、编辑initorcl.ora文件,也就是把里面的特殊的看不懂的字符给删除,同时找到sga_max_size这个参数,改成之前没有修改时的数值或者改一个较小的值,例如,sga_max_size=900m,大小自己看着改。改好后的样子大概是
orcl.__db_cache_size=356515840 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__oracle_base='/data/oracledba'#oracle_base set from environment orcl.__pga_aggregate_target=385875968 orcl.__sga_target=650117120 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=264241152 orcl.__streams_pool_size=8388608 *.audit_file_dest='/data/oracledba/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/data/oracledba/oradata/orcl/control01.ctl','/data/oracledba/fast_recovery_area/orcl/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_name='orcl' *.db_recovery_file_dest='/data/oracledba/fast_recovery_area' *.db_recovery_file_dest_size=4322230272 *.diagnostic_dest='/data/oracledba' *.dispatchers='(protocol=tcp) (service=orclxdb)' *.log_archive_dest_1='location=/data/archivelog' *.memory_target=1033895936 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='exclusive' *.sga_max_size=988m *.undo_tablespace='undotbs1'
4、看看$oracle_home/dbs目录下有没有文件以lk+实例名的文件,例如lkorcl 有的话可以先改名备份,在删除
5、可以启动了
starup nomount
如果可以nomount起来基本就没问题了,接着可以
alter database mount; alter database open;
切记,在改spfile的参数之前一定要进行备份,最好也把控制文件也一起备份,给自己留个退路,不然把自己玩死了,只能跑路吧