今天看到网上的一个评论,就做了一个实验:
step1: 修改 db_cache_size 的大小, 报如下错吴
SQL> alter system set db_cache_size=350M scope=both;
step2: 修改sga_max_size的大小
SQL> alter system set sga_max_size=850M scope=spfile;
step3: 关闭数据库
SQL> shutdown immediate;
step4: 启动数据库,错误来了:
SQL> startup
提示 SGA_MAX_SIZE 的大小比 MEMORY_TARGET 大,所以启动不了
在网上搜索可一下,觉的这个解释比较贴切:
memory_target是oracle11g用于自动内存管理的,它与memory_max_target是成对出现的,是11g内存管理上的新特 性,这一特性的出现使得pga+sga做为整体内存使用被一致的纳入自动管理范畴。简而言之memory_target就是整个实例所能使用的内存大小, 包括PGA和SGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和SGA所用的内存可以根据当前负载情况自动相互转换。
如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数 MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节MEMORY_TARGET的大小,但是不允许超过MEMORY_MAX_TARGET的值。
由此可见sga的尺寸是不能大于memory_target的。所以我们要调整memory_target和memory_max_target的值高于sga_max_size。
step5:解决SGA_MAX_SIZE 的大小比 MEMORY_TARGET 大导致数据无法启动的错误
由于数据库无法启动,只能调编辑参数文件:
SQL> create pfile='/tmp/pfile20150115.txt' from spfile;
[oracle@REDHAT6 tmp]$ vi/tmp/pfile20150115.txt
将memory_target的值修改成1.2G(由于是本地虚拟机,所以比较小))
即:memory_target=1257889280
备份以前的参数文件
恢复参数文件:
SQL> create spfile from pfile='/tmp/pfile20150115.txt';
启动数据库:
OK,到此结束,数据库正常启动。