terça-feira, 6 de setembro de 2016

ERRO - ORA-00030 : User session ID does not exist


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