Ao tentarmos excluir uma sessão do banco de dados, com o comando:
SQL> alter system kill session '11,20425' immediate;
recebemos o erro:
ORA-00030: User session ID does not exist.
Após esse erro, começamos a investigar a sessão e as formas possíveis para eliminá-la do banco de dados.
1) Verificar a sessão no banco de dados
SQL> select username,sid,serial#,status,osuser,inst_id from gv$session where username='USER_APP';
USERNAME SID SERIAL# STATUS OSUSER INST_ID
------------ ---------- ---------- -------- ------------------------------ ----------
USER_APP 11 20431 ACTIVE user_app 1
Com isso, percebemos que a sessão existe no banco de dados.
2) Identificar o processo no sistema operacional
Com o SQL abaixo, podemos identificar o processo da sessão no sistema operacional.
SQL> select logon_time, sid, serial#, username, status, process from gv$session where username='USER_APP';
LOGON_TIME SID SERIAL# USERNAME STATUS PROCESS
------------------- ---------- ---------- ------------ -------- ------------
21/07/2016 13:19:15 9233 15693 USER_APP ACTIVE 65143038
Com o valor do PROCESS, podemos ir no sistema operacional e eliminar a sessão.
No S.O. Unix:
-------------
$ ps -ef | grep 65143038
user_app 65143038 1 0 13:36:48 - 0:00 oraclexpto (LOCAL=NO)
Em seguida, utilizamos o comando kill -9 para matar a sessão.
$ kill -9 65143038
Voltando ao banco de dados, veremos que a sessão não existe mais.
SQL> select username,sid,serial#,status,osuser,inst_id from gv$session where username='USER_APP';
no rows selected
Obs.: Matar uma sessão de banco de dados com kill -9 no sistema operacional, não é recomendado. Estamos utilizando neste caso, por ser uma sessão perdida no banco de dados.
3) Listar o SPID para eliminar o processo no sistema operacional.
Também podemos utilizar o SQL abaixo para identificarmos o processo no sistema operacional.
SQL>
SELECT S.SID, S.SERIAL#, S.USERNAME, P.SPID
FROM (SELECT SID, SERIAL#, USERNAME, PADDR FROM V$SESSION where status <> 'KILLED') S,
(SELECT SPID, ADDR, UPPER(USERNAME) FROM V$PROCESS ) P
WHERE S.PADDR = P.ADDR(+)
ORDER BY SPID, S.SID
Ex.:
SID SERIAL# USERNAME SPID
---------- ---------- ------------ ------------------------
11043 1 65143038
O resultado do SQL mostrará todas as sessões do banco de dados e sues respectivos SPID (Processos).
$ ps -ef | grep 65143038
user_app 65143038 1 0 13:36:48 - 0:00 oraclexpto (LOCAL=NO)
Da mesma forma que mostramos no item anterior, utilizaremos o comando kill -9
$ kill -9 65143038
4) O PROCESS ou SPID não encontrado no S.O.
Mesmo consultando as tabela do banco de dados, não encontramos o processo indicado no banco no sistema operacional para podermos eliminar a sessão utilizando o kill -9
Verificamos o alert.log do banco de dados, onde encontramos o erro: ORA-24756: transaction does not exist
A solução que conseguimos encontrar para resolver o problema foi executar um startup force com o banco de dados online.
SQL> startup force
** A outra solução seria parar e reiniciar o banco de dados.
Referências:
https://community.oracle.com/thread/2314375?tstart=0
ORA-30 Received When Trying To Kill Session (Doc ID 1011386.6)
ORA-00030 When Trying to Kill a Session In a RAC database. (Doc ID 751638.1)
http://web3null.blogspot.com.br/2013/10/ora-00030-user-session-id-does-not-exist.html
http://glufke.net/oracle/viewtopic.php?f=6&t=9284