系統遇到過幾次這種問題,一個系統申請的session數過大,導致數據庫進程數滿,無法連接的問題。
pl sql develope 報的錯誤是:ORA-12170:TNS:鏈接超時
oracle用戶登錄服務器,使用dba身份進入sqlplus:
sqlplus / as sysdba
報錯信息如下:
SQL*Plus: Release 11.2.0.1.0 Production on Thu Feb 1 18:34:46 2018
Copyright (c) 1982, 2009, Oracle. All rights reserved.
ERROR:
ORA-00020: maximum number of processes (1000) exceeded
線程數超過最大值1000了。
由於oracle 線程數超過最大,所以不能登錄了。(當然,sqlplus / nolog 是可以登的,但是不能用)
1、這個時候,就只有關閉oracle 的監聽:
lsnrctl stop # start 啟動 status 查看狀態
關閉了監聽,就不會有新的用戶登錄進來,也不會生成新的session,占用process了。
稍等一下,就可以使用sqlplus / as sysdba 登錄了(oracle 會保存一些已經關閉的session,這些session會被標記為“kill”狀態,2小時候清除,所以關閉監聽后,一會就會,process 使用就會掉一點下來)
2、這個時候,執行SQL:
select count(1) from v$session;
查看session使用情況。
3、執行SQL:
select machine,count(1)coun from v$session group by machine order by 2 desc
查看session數最多的機器(也可以換成user/program)
4、這樣,就找到占用session多的機器、用戶、程序。然后執行如下SQL:
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.machine = 'venn01';
注意最后一個條件,換為上一步查出來的數據,字段也要改下
spid即為占用session最多的機器、用戶、程序的線程號(同系統進程號)
5、執行:
kill -9 spid
即可殺掉session(見效快),參見我的博客:關於oracle的鎖表解決session marked for kill
6、這個時候,就可以使用pl sql developer登錄了,執行SQL
select 'kill -9 '||spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.machine = 'venn01';
7、可以打印出kill 命令,直接copy 一列,粘貼到服務器上執行,就搞定了。
科普一下oracle的session和process
session : 指用戶連接的session
process : 指session執行的線程
session 可以從 v$session 表查看,process 可以從v$process 表查看,
session和process 表的關系為:
select s.sid,p.PID,s.*,p.* from v$session s,v$process p where s.paddr=p.addr
session表中保存了process的地址。
select * from v$parameter where name like 'sessions' or name like 'processes'
在v$parameter 表可以查看session和process的配置,建議配置session 略大於process,可以修改(重啟生效):
SQL> alter system set processes=500 scope=spfile; SQL> alter system set sessions=555 scope=spfile;
也可以這樣 查看:
SQL>show parameter processes; SQL>show parameter sessions;