OS:redhat 4 64bit
Database:oracle10gR2 for linux 64bit
Physical memory:32G
昨天晚上一哥们Q我说数据库关闭缓慢,我叫他贴出告警日志,部分关键信息如下:
Waiting for dispatcher 'D000' to shutdown
All dispatchers and shared servers shutdown
然后我又问他数据库是专有模式还是共享模式,他说专有模式,OK 根据告警信息可以判断 数据库打开了shared_servers,还有dispatcher,于是叫他运行如下两个命令
alter system set shared_servers=0;
alter system set dispatchers='';
然后重启数据库。到此 数据库关闭正常。
可过了不久 关闭数据库又极为缓慢,再次贴出告警信息,关键部分如下
SHUTDOWN: Active processes prevent shutdown operation
可以知道 数据库有一个活动进程阻止了shutdown 操作,OK,shutdown abort,重启
select sid,event from v$session;
查询到有一个 等待事件 jobq slave wait
ok 设置job_queue_processes=30;再次关闭数据库 ,正常关闭 job_queue_processes默认为10
重启数据库,再次关闭数据库 还是比较缓慢,告警日志如下
Shutting down instance (immediate)
License high water mark = 2
Fri Feb 12 11:33:27 2010
Stopping Job queue slave processes, flags = 7
Fri Feb 12 11:33:27 2010
Job queue slave processes stopped
呵呵,job queue这个进程延缓了 数据库的关闭。如果想要
彻底解决这个问题可以设置job_queue_processes=0,
一个生产系统是不会经常关闭的,如果没有出现 jobq slave wait等待事件就别理它了吧。
另外查看它的SGA 为3G,PGA为6G,我当时就郁闷了,怎么这样分配内存呢,然后叫他分配12G给SGA,12G给PGA(其实内存分配多少没有一个定值,根据实际情况调整,方法很多比如看等待事件,各种顾问程序...关键是要找到PGA,SGA的平衡点)之后重启数据库,结果报错,信息如下
SQL> startup
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
这个错误提示就是说SGA超过了最大值这里分配了12G
由于os是64bit,db也是64bit,不存在db限制,那么这个限制应该是linux内核参数引起的。这个内核参数就是
/etc/sysctl.conf 中的kernel.shmmax,这个参数决定了OS的最大共享内存,由于SGA是共享的,此参数设置过小必然导致SGA不能设置过大。更改kernel.shmmax解决问题。