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

Oracle连接数太多报错-ORA-12516错误

系统上线,一下子有几百人用,数据库出现异常

?

ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程?

?

一开始以为数据库出了问题呢。

?

使用sqlplus连接以后,查看当前会话数、processes和sessions值,发现session数和2个参数的值已经非常逼近

?

SQL> select count(*) from v$session; 
COUNT(*)---------- 88 
SQL> show parameter processes
NAME TYPE VALUE 
db_writer_processes integer 1 
gcs_server_processes integer 0
job_queue_processes integer 10 
log_archive_max_processes integer 2 
processes integer 100 
SQL> show parameter sessions 
NAME TYPE VALUE 
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0 
license_sessions_warning integer 0 
logmnr_max_persistent_sessions integer 1 
sessions integer 110 
shared_server_sessions integer

?

?

?


?

2、修改processes和sessions值

SQL> alter system set processes=300 scope=spfile; 系统已更改。
SQL> alter system set sessions=335 scope=spfile; 系统已更改。

?


?

3、查看processes和sessions参数,但更改并未生效

SQL> show parameter processes NAME TYPE VALUE db_writer_processes integer 1 gcs_server_processes integer 0 job_queue_processes integer 10 log_archive_max_processes integer 2 processes integer 100 SQL> show parameter sessions NAME TYPE VALUE license_max_sessions integer 0 license_sessions_warning integer 0 logmnr_max_persistent_sessions integer 1 sessions integer 110 shared_server_sessions integer

?


?

4、重启数据库,使更改生效 SQL> shutdown SQL> startup SQL> show parameter processes NAME TYPE VALUE db_writer_processes integer 1 gcs_server_processes integer 0 job_queue_processes integer 10 log_archive_max_processes integer 2 processes integer 300 SQL> show parameter sessions NAME TYPE VALUE java_soft_sessionspace_limit integer 0 license_max_sessions integer 0 license_sessions_warning integer 0 logmnr_max_persistent_sessions integer 1 sessions integer 335 shared_server_sessions integer

?

?

?其他

???
ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:

???sessions=(1.1*process+5)

???? 但是我们增加process数时,往往数据库不能启动了。这因为我们还漏调了一个unix系统参数:它是/etc/proc/kernel 中semmns,这是unix系统的信号量参数。每个process会占用一个信号量。semmns调整后,需要重新启动unix操作系统,参数才能生效。不过它的大小会受制于硬件的内存或ORACLE SGA。范围可从200——2000不等。
?????上面说的是unix,在RHEL5中, 就修改/etc/sysctl.conf里面的信号量:
kernel.sem ? = ? 2000 ? 32000 ? 100 ? 128 ? ? //传说中参数依次为SEMMSL(每个用户拥有信号量最大数);SEMMNS(系统信号量最大数);SEMOPM(每次semopm系统调用操作数);SEMMNI(系统信号量级数最大数).??
所以要修改的是第二个参数

?

?


?? semmns的计算公式为:??SEMMNS>processes+instance_processes+system
?
?? processes=数据库参数processes的值??

? ?instance_processes=5(smon,pmon,dbwr,lgwr,arch)

?? system=系统所占用信号量。系统所占用信号量可用下列命令查出:
? ?#ipcs -s?
?? 其中列NSEMS显示系统已占用信号量。

??

其它一些跟连接有关的参数,如 licence_max_sessions, licence_sessions_warning 等默认设置都为零,也就是没有限制。我们可以放心大胆地使用数据库了。


?

?