看到这个报错的时候,已经连不上数据库了。所以思路是:先结束掉部分进程,再增大连接数。
先查找进程:
[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