先讲一下我的环境:
数据库:Oracle 9.2.0.1 for Windows
操作系统:Windows 2003 Server
硬件:2*至强E5310 4GB内存
今天我在做数据库操作的时候,发现对400多万条的数据进行一次select count(*)操作居然用了60多秒,而在另一台小型机上对同样数据的表进行相同的select count(*)操作时只要1秒。所以我到网上查了些资料,有人说可以修改sga_max_size值。
于是,我把Oracle的sga_max_size修改为2G,修改完后Oracle要求我重启数据库,我就按要求重启了。
结果,惨剧发生了:数据库无法正常启动。当时我就傻眼了,相关的应用都被逼中断了,过了一会就有人打电话来问怎么回事了。
在网上搜了一遍,没找到解决的方法,后来就去http://www.itpub.net论坛发贴问高手了。那里的高手挺热心的,很快就有了回复,http://www.itpub.net/thread-1029045-1-1.html。
在得到回复之前,我在网上看到有人说sga_max_size的值最大只能设到1.7G,超过了Oracle就起不来了。哎,好后悔啊,后悔我太贪心了。
接着,我看到在硬盘的<Oracle安装目录>/Ora92/database下有个spfileXXX.ora,用记事本打开后,前面的一段是乱码,但在后面有sga_max_size=XXXXXX的字符串。当时我以为把这个参数后面的值改一下就可以了。于是我就把sga_max_size的值改小成1G,并用记事本保存了一下。然后重启服务器,结果数据库还是没有启动起来。
我回到论坛的贴子,发现有好几个人进行了回复。
有人回答说在<Oracle安装目录>/admin/XXX/pfile下建pfile文件。我按照方法在此目录下建了一个init.ora文本文件,在文件里加了两行:
SPFILE='D:/Oracle/ora92/database/spfileXXX.ora'
sga_max_size=1228m
然后在sqlplus里运行:startup pfile='D:/Oracle/Admin/XXX/pfile/init.ora'
本来以为可以运行了,但最终结果还是没有成功启动数据库。
接着有人说不能修改spfileXXX.ora文件,不然会被破坏文件结构。这时,我开始暗自庆幸自己在修改spfileXXX.ora文件之前先做了个备份。于是,我把备份的那个文件恢复出来,然后再运行startup pfile='D:/Oracle/Admin/XXX/pfile/init.ora',这时看到“数据库已打开”、“数据库已启动”字样的我终于松了一口气,Oracle终于正常了,我又看到了原来的那些数据。
到这时,我还以为数据库已经恢复正常,于是我把服务器重启了一下,想看看数据库是否能正常自启动。
结果呢?电话又来了,不断有人问:数据库是不是又不正常了?
查了一下原因,发现spfile里的那个sga_max_size的值还是原来的2G,晕倒,数据库正常运行后忘了保存sga_max_size的值了。
于是,我按照上面的方法重新运行startup pfile='D:/Oracle/Admin/XXX/pfile/init.ora',本以为数据库能正常启动,但事与愿违,系统提示“shared memory ... exist”。接着无论我怎么改init.ora这个pfile文件,数据库就是起不来。
这是怎么回事?刚才还能正常解决问题的方法怎么行不通了?经过反复思考,想起刚才成功解决问题前,我曾修改过spfile文件破坏了其文件结构,而这次在启动前spfile文件一直是正常的文件结构。是不是因为这次正常的spfile文件导致了数据库的某些进程一直在运行而出现“shared memory ... exist”错误提示的出现?
想到这,我把正常的spfile文件备份了一份,然后对spfile文件进行了修改并保存。重启服务器,把备份的正常spfile文件恢复,接着运行startup pfile='D:/Oracle/Admin/XXX/pfile/init.ora'。
哈哈,终于又看到“数据库已经启动”的提示,高兴之余不忘了把数据库的sga_max_size参数的正常值保存下来:
alter system set sga_max_size=1170m scope=spfile;