Fork me on GitHub

Oracle报错排查:ORA-00020:maximum number of processes (500) exceeded

看到这个报错的时候,已经连不上数据库了。所以思路是:先结束掉部分进程,再增大连接数。

先查找进程:

[root@oramod ~]# ps -ef|grep oracle
oracle    4801     1  0 Apr28 ?        00:02:24 tnslsnr LISTENER -inherit
oracle   16284     1  0 11:41 ?        00:00:06 ora_pmon_orcl
......
oracle   22021     1  0 15:07 ?        00:00:00 oracleorcl (LOCAL=NO)
oracle   22025     1  0 15:07 ?        00:00:00 oracleorcl (LOCAL=NO)
oracle   22029     1  2 15:07 ?        00:02:53 oracleorcl (LOCAL=NO)
......

发现非本地连接都带有LOCAL=NO,这样就简单了,验证一下:

[root@oramod ~]# ps -ef|grep LOCAL=NO|grep -v grep
oracle   22021     1  0 15:07 ?        00:00:00 oracleorcl (LOCAL=NO)
oracle   22025     1  0 15:07 ?        00:00:00 oracleorcl (LOCAL=NO)
......

确实都是Oracle的进程,结束掉几个就好了,只要让能连上数据库:

# 两种写法都可以,结束掉前10个进程
[root@oramod ~]# ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|head|xargs kill -9
[root@oramod ~]# ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|head|xargs kill -9

连接数据库:

bash-4.1$ sqlplus /nolog
SQL> connect /as sysdba

修改连接数,重启Oracle:

SQL> alter system set processes=1000 scope=spfile;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

验证一下:

SQL> show parameter processes;

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes              integer     1
db_writer_processes          integer     1
gcs_server_processes             integer     0
global_txn_processes             integer     1
job_queue_processes          integer     1000
log_archive_max_processes        integer     4
processes                integer     1000

连接数已修改。但是没过一会连接又满了:ORA-00020:maximum number of processes (1000) exceeded,这时候就要排查问题了。

再次连上数据库,观察会话使用情况:

SQL> select event,program,count(*) from v$session group by event,program order by 3;
......
EVENT                                   PROGRAM                             COUNT(*)
------------------------------------------------------------------------------ ----------
rdbms ipc message                       oracle@oramod (GEN0)                      1
SQL*Net message from client             plsqldev.exe                              10
SQL*Net message from client             JDBC Thin Client                          78

可以看到JDBC连接数过多。

下面排查下是哪个项目的问题,首先查看每个oracle帐户的连接总数 :

SQL> select username,count(username) from v$session where username is not null group by username;

USERNAME               COUNT(USERNAME)
------------------------------ ---------------
TEST_ROGCHEN                    11
DEPT_USERCENTER                 11
MMSW                        68
BYS                      2
RSBGGFWWTADMIN                   1
NW_SYBX                     12
APP_LZF                      1
FZDKRH                       3
SYS                      3
FZGGFWWT                     4

10 rows selected.

可以看到连接最多的是MMSW账户。

查看所有链接Oracle的客户端的IP等信息:

  • 由于缺省从 v$session 中不能直接获得客户端 IP,可以在数据库中创建一个追踪客户端IP地址的触发器:

    SQL> create or replace trigger on_logon_trigger after logon on database
      2  begin
      3      dbms_application_info.set_client_info(sys_context('userenv', 'ip_address')); 
      4  end;
      5  /
    
  • 显示客户端信息:

    SQL> select sid,serial#,username,program,machine,client_info from v$session where username is not null order by username,program,machine;
    
    ......
        SID    SERIAL# USERNAME    PROGRAM             MACHINE   CLIENT_INFO
    ----------------------------------------------------------------------------------------
        12    505 TEST_ROGCHEN    JDBC Thin Client     rhel7     192.168.44.81
    ......
    

可以看到链接最多的来自192.168.44.81这台主机。

所以初步判断为192.168.44.81主机上使用MMSW账户的项目有问题。然后就没有然后了。

参考文章

Comments