`

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 等默认设置都为零,也就是没有限制。我们可以放心大胆地使用数据库了。


 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics