解决SGA 不能超过4G,数据库关闭缓慢的问题

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解决问题。

原文地址:https://www.cnblogs.com/hehe520/p/6330617.html