几天前,一个朋友遇到一个故障问题,来电咨询笔者。故障解决后,他将故障解决记录和相关资料发给笔者。虽然不是什么很大的故障点,但是笔者觉得还是一个很好的案例积累。在征得朋友的同意后,就写成此文。
1、故障发生
朋友专注的是一个数据仓库系统的开发。由于种种原因,目前测试只能在一台Window 2003为服务器的PC上进行。数据库服务器为Oracle 10gR2,机器内存为4G。
在测试一个大作业时候,朋友发现运行时间过长,超过了容忍范围。所以,检查相应配置。之后,他发现Oracle SGA的空间只有1G,PGA设置也只有256M。他想通过扩大这两个参数来增加可使用的内存资源。于是问题发生了。
他将SGA_TARGET参数调节为2G以上,PGA相应值也进行了调整。重启数据库后,启动出错。
SQL> startup
ORA-00093: pga_aggregate_target must be between 10M and 4096G-1
SQL> show parameter pga_agg
ORA-01034: ORACLE not available
2、问题分析和解决
从现象上看,应该是参数文件信息修改导致启动实例过程失败。我们说Oracle启动是分为三个阶段,分别为unmount,mount和open。
Unmount阶段进行的主要是实例Instance启动,后台进程初始化和共享内存分配。同时,定位到controlfile位置,为下一步mount阶段做准备。
SGA和PGA分配,是定义在参数文件spfile上的。所以在startup unmount阶段,数据库启动就已经失败了。
那么,我们解决问题的关键就在两个问题上,首先需要找出之前使用的参数数值(上次正常启动使用的),其次就是将错误的PGA/SGA值修改掉。
幸好朋友之前为了发现性能问题,生成过一次AWR报告。在AWR报告的最后部分,是包括init参数信息的。
其中就包括了被修改的参数原有取值。
另一个问题就是关于spfile的修改。Oracle目前采用的参数文件都是二进制格式的spfile。只有在预设位置的spfile没有的情况下,Oracle才会去寻找pfile格式参数文件。
那么,我们首先需要将spfile转化为pfile,才能进行修改。
SQL> create pfile = 'E:\oracle\product\10.2.0\db_1\dbs\tmp_init.ora' from spfile;
文件已创建。
用编辑工具可以打开tmp_init.ora文件。将其修改为正确的取值。
*.open_cursors=300
*.pga_aggregate_target=268435456
*.processes=200
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=60
*.sga_max_size=1073741824
*.sga_target=1073741824
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
最后保存tmp_init.ora文件。使用这个文件启动数据库进入unmount阶段。
SQL> startup nomount pfile='E:\oracle\product\10.2.0\db_1\dbs\tmp_init.ora'
ORACLE 例程已经启动。
Total System Global Area 1073741824 bytes
Fixed Size 1250044 bytes
Variable Size 276827396 bytes
Database Buffers 788529152 bytes
Redo Buffers 7135232 bytes
之后尝试进入mount和open阶段。
SQL> alter database mount;
数据库已更改。
SQL> alter database open;
数据库已更改。
应用访问故障消失。但是,我们当前启动时使用ASCII格式的pfile参数,要将其更新到spfile中,才能算最后解决问题。
SQL> create spfile from pfile='E:\oracle\product\10.2.0\db_1\dbs\tmp_init.ora';
文件已创建。
为确保没有问题,重新启动一下数据库。
SQL> conn sys/sys@sdno as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 1073741824 bytes
Fixed Size 1253124 bytes
Variable Size 100663548 bytes
Database Buffers 964689920 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL>
故障解决。
最后,我们可以思考一下朋友的系统命名有4G内存,为什么不让设置2G的SGA空间?
笔者猜想,可能还是与服务器操作系统版本有关。32bit系统下的Oracle,虽然系统可以访问到最多4G的内存,但是SGA存在1.7G的限制。虽然网络上有关于Windows2003突破1.7G限制的方法,但是并不是推荐使用的。
所以,笔者建议朋友去检查一下操作系统的位数版本。如果是32bit的,可以考虑提升软件应配置,安装为64bit的OS。这样就可以更有效的使用内存。
3、结论
Oracle数据库是一个复杂灵活的系统,相关的知识点多不胜数。这个故障虽小,但是却集合了不少的知识点。故障场景也是我们经常会遇到的,记录下来待有需要的朋友待查。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-714049/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-714049/