SNIPED Sessions and ORA
SNIPED Sessions and ORA
processes (%s) exceeded
Posted by Kamran Agayev A. on December 14, 2010
When you implement the resource limit, the sessions that exceed the IDLE limit is marked as
SNIPED in V$SESSION view and you may get “ORA-00020: maximum number of processes
(%s) exceeded” error because Oracle doesn’t kill that session in OS level and it assumes it as a
“process”. So for this, you need to kill those sessions manually
Here I show a little demonstration of the whole process: – First of all, set the
RESOURCE_LIMIT parameter to TRUE to enforce the resource limit in database profiles
view source
print?
5
6 SQL> alter system set resource_limit=true;
7 System altered.
view source
print?
view source
print?
1 SQL> grant dba to usr identified by usr;
2 Grant succeeded.
3
4 SQL> alter user usr profile test_profile;
5 User altered.
view source
print?
07
08 SQL> startup force
09
10 SQL> show parameter processes
11 NAME TYPE VALUE
12 processes integer 25
13
14 SQL> select count(1) from v$process;
15
16 COUNT(1)
17 ----------
18 22
Now open two different terminals and connect to the database with USR user:
view source
print?
1 sqlplus usr/usr
Check the view V$PROCESS. It should be 24
view source
print?
Now open third terminal and try to connect to the database with the user USR.You will get an
error because the count of the processes will reach the limit:
view source
print?
3 ERROR:
4 ORA-00020: maximum number of processes (%s) exceeded
5
6 Enter user-name:
7
8 SQL>
Now wait for a minute to reach the limit of the IDLE_LIMIT resource (we’ve set it to 1 minute)
and query the SYSDATE from any USR session:
view source
print?
05
06 STATUS COUNT(1) USERNAME
07 -------- ---------- ------------------------------
08 ACTIVE 1 SYS
09 ACTIVE 16
10 INACTIVE 2 SYS
11 SNIPED 2 USR
12 3
That’s the issue. If you try to connect to the database, you’ll get ORA-00020 error again. Please
note that SNIPED doesn’t mean that it’s KILLED. It is not either killed, nor active. The user is
not able to run any query, however it holds a process on OS level:
view source
print?
Run any query with already connected (and SNIPED) USR user. You’ll get the following error:
view source
print?
3*
4 ERROR at line 1:
5 ORA-02396: exceeded maximum idle time, please connect again
6 SQL>
view source
print?
01 SQL> select s.status, count(1), s.username from v$process p, v$session s
02 where paddr(+)=addr
03 group by s.status, s.username
04 order by 1;
05
06 STATUS COUNT(1) USERNAME
07 -------- ---------- ------------------------------
08 ACTIVE 1 SYS
09 ACTIVE 16
10 INACTIVE 2 SYS
11 SNIPED 1 USR
12 4
13
14 SQL> select count(1) from v$process;
15
16 COUNT(1)
17 ----------
18 24
The process will be free only when you “exit” from Sql*Plus. Exit from the session that you got
an error and query V$PROCESS again:
view source
print?
To kill the SNIPED sessions you have two options. The first option is to run ALTER SYSTEM
KILL SESSION command. For this you need to get SID and SERIAL# of the sniped session.
view source
print?
11
12 SQL> select s.status, count(1), s.username from v$process p, v$session s
13 where paddr(+)=addr
14 group by s.status, s.username
15 order by 1;
16
After some seconds you’ll see that the session is cleared from both views:
view source
print?
1 SQL> /
2
However, due to some bugs, sometimes you may not get the sessions killed using ALTER
SYSTEM KILL SESSSION command. For this, you need to kill the process from OS level.
view source
print?
05 SPID STATUS
06 ------------ --------
07 2795 SNIPED
08
09 [oracle@localhost ~]$ kill -9 2795
10
11 SQL> select spid, status from v$process p, v$session s
12 where paddr=addr
13 and s.username='USR';
14
15 no rows selected
16
17 SQL>
view source
print?
3*
4 ERROR at line 1:
5 ORA-03135: connection lost contact
6
7 SQL>