问题现象
使用plsql developer 登陆数据库,有如下报错:
原因定位
怀疑是数据库现有的进程数已经达到参数processes的值。
于是登陆服务器后台验证:
# su - oracle
Last login: Fri Jul 9 13:37:03 CST 2021 on pts/0
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Tue Jul 13 09:51:57 2021
Copyright (c) 1982, 2014, Oracle. All rights reserved.
ERROR:
ORA-00020: maximum number of processes (300) exceeded
Enter user-name:
果然是连接数已达上限。
说明:只要会话连接数超过设定的process值或sessions值,再有新的会话进程,就会产生12516错误。
小补充
SQL>select count(*) from v$process; --查询数据库当前进程数
SQL>select value from v$parameter where name = ‘processes’; --查询processe的上限值
SQL> show parameter processes --查询processe的上限值
SQL>show parameter sessions --查询session的上限值
问题处理
一种处理方法是修改processes和sessions的值(首先需断开当前至少一个连接,保证管理员账号能够成功登陆)。
操作步骤如下:
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Tue Jul 13 10:57:28 2021
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> show parameter processes --查询参数processes当前值
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 2
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 1000
log_archive_max_processes integer 4
processes integer 300
SQL> alter system set processes=1000 scope=spfile; --修改参数processes值为1000
System altered.
SQL> show parameter sessions --查询参数sessions当前值
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
sessions integer 480
shared_server_sessions integer
SQL> alter system set sessions=1105 scope=spfile; --修改参数sessions值为1105
System altered.
小补充
有一种建议标准是:
sessions=1.1processes+5; --sessions值和processes值的计算公式
因此如果要将processes数设置为1000,则sessions数应该为1.11000+5=1105
但若此时再次查看processes和sessions参数值,会发现更改并未生效,依然是之前的值。
需要重启数据库使其生效:
SQL> shutdown
SQL> startup
成功重启数据库后,再次查看,发现更改已生效。
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 2
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 1000
log_archive_max_processes integer 4
processes integer 1000
SQL> show parameter sessions
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
sessions integer 1105
shared_server_sessions integer
本次问题处理完成。