日期:2014-05-16  浏览次数:20375 次

Oracle 更改SGA, Memory target
   本想玩玩更改 Oracle SGA的。 没想到碰到的事情还不少。 下面就来说说这个可怕的过程。

开始, 更改sga成功。
SQL> sqlplul /nolog
SQL> conn as sysdba
SQL>   alter system set sga_max_size=1500m scope=spfile;


可当我重启数据库的时候却悲剧了, 数据库启动失败。 提示某些参数设置太小。 下面就开始了恢复数据库的历程了 。

环境:
Oracle: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

OS:
HP-UX B.11.31
Version:   U (unlimited-user license)


   刚开始, 按照数据库的错误提示, 某些值设置小,(例如 sga_max_size)。于是就在目录 。。。\admin\sid\pfile\创建了一个pfile 文件init.ora, 内容是:
SPFILE='$Oracle_HOME\dbs\spfilesid.ora'
sga_max_size=1800m


  在sqlplus 里面, 继续启动数据库

startup pfile=init.ora


大家主要路径, 我用的是相对路径。 可仍然启动失败, 说其他的参数设置的太小。

这时候, 我想如果继续这样设置下去的话, 那我的设置多少具体的参数啊。 而且每一个具体内存参数的大小, 我也不太清楚设置多少为最佳。

突然想起来, Oracle11g, 是有自动内容管理的Automatic Memory Management (AMM)的。 我只要设置MEMORY_TARGET 和 MEMORY_MAX_TARGET的值就好了.

Oracle自动帮我们优化里面每种类型的内存大小。 像SGA, PGA。 SGA中的shared pool,  buffer cache, large pool, java pool  和其它。

这里简单的引入下 MEMORY_TARGET和MEMORY_MAX_TARGET的概念。
MEMORY_TARGET specifies the Oracle system-wide usable memory.
MEMORY_MAX_TARGET (…) decide on a maximum amount of memory that you would want to allocate to the database for the foreseeable future.

其实这写值的大小限制, 还跟我们mount上的资源大小有关。 这个就飘过。 大家可以看看这篇文章, 关于那两个值大小可以设置为多大及可能空间不足的情况下的解决方案 [url] http://www.ora600.be/news/oracle-11g-memorytarget-memorymaxtarget-and-devshm[/url]

接下来, 把pfile里面的sga_max_size=1800m 删掉。 现在的内容是:
SPFILE='$ORACLE_HOME/dbs/spfileslamdev.ora'
memory_max_target=3000M
memory_target=2800M



改好后, 在sqlplus里 启动数据库:
SQL> startup pfile=init.ora


这下数据库终于可以成功启动了。 哈哈

SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 3008M
sga_target                           big integer 2512M




但别高兴的太早, 还是shutdown 再 startup 下比较保险。

SQL> shutdown immediate

数据库成功停掉。
SQL> shartup


这次, 数据库更第一次一样, 还是失败。 这下是因为没有把更改的东西写进spfile。 只要重来:
SQL>startup pfile=init.ora


但这次也有错误, 提示share空间不够。 问题还挺多哈。

我以前有看过类似的错误, 大概是 share里的东西还在运行。 这个有workaround.

先把spfile copy 一份, 然后打开spfile进行更改保存。 随便改, 因为我们就是要破坏spfile。 改好后, 启动数据库
SQL>startup

这时肯定是失败的。 然后把我们之前备份的那个spfile恢复。 从pfile启动:
SQL>startup pfile=init.ora


这下可以成功启动了。 把内容更改进spfile:

SQL>alter system set memory_max_target=3000m scope=spfile;
... 成功更改
SQL>alter system set memory_target=2800m scope=spfile;
... 成功更改


这下都做好了, 停掉数据库再启动。 一切ok了。  随便玩玩, 害的我晚饭推迟3个小时。