Muito
boa tarde, a todos!
Hoje
gostaria de contar uma experiência que tive com o Oracle (na versão 10G)
rodando em um servidor com Windows Server 2003.
A
situação foi mais ou menos a seguinte: um sistema consultava uma view, que
fazia referência a um banco de dados remoto (via DBLink). Devido a um problema,
o banco remoto ficou indisponível por algum tempo no momento de uma transação
do sistema. Com isso, a projeção dos dados não fora possível, e simplesmente o
banco não retornava nada e a aplicação ficava "tentando" consultar os
dados. Depois de um tempo, o banco de dados remoto retornou, porém a session
ainda estava tentando consumir a informação pela view. A uma altura dessa, o
usuário que disparou a requisição já tinha saído ou fechado o browser, ou qualquer
outra coisa, porém a session ficou executando no servidor de banco. Qualquer
outra consulta na view não retornava nada, ou melhor, ficava rodando por horas
sem concluir a projeção. Tentei recompilar a view e não conseguia. Criei uma
outra view idêntica a anterior (imaginando que o problema podia ser no banco
remoto), e consegui cria-la e usa-la normalmente. Então tentei matar a sessão
que estava gerando o lock no objeto (através do comando: ALTER SYSTEM KILL
SESSION 'sid,serial#';), mas não consegui sucesso.
O que
precisava fazer estava claro, matar a session pois ela estava bloqueando o
objeto.
Para
fazer isso, precisei matar o processo/thread diretamente no servidor, que nesse
caso possuía um sistema operacional Windows Server.
Em um
ambiente UNIX, é possível ver todos os processos ativos no servidor, enquanto
que no WINDOWS, os processos Oracle ficam ativos no programa oracle.exe como
threads. No UNIX finalizamos uma sessão pelo SO com o comando: KILL -9 SPID.
Podemos saber o SPID através da consulta:
select
s.username, s.osuser, s.program, s.sid, s.serial#, p.spid
from v$session s,v$process p
where s.paddr = p.addr;
Já
para Windows, para matar um processo usamos o comando ORAKILL, com a
seguinte sintaxe:
ORAKILL
SID THREAD
Onde
SID: a instância Oracle;
e
THREAD: a thread (spid da consulta acima) que deseja matar.
Exemplo:
orakill housework 902
Kill of thread id 902 in instance housework successfully
signalled.
Com
esse procedimento foi possível matar a session bloqueada, recompilar o objeto e
acessá-lo normalmente.
Para
auxiliar esse processo, o DBA também pode utilizar programas para matar a
session. Burleson indica alguns:
- QuickSlice;
- PStat;
- Process Explorer.
Eu
particularmente gosto do Process Explorer pois é bem prático. É possível ver a
interface da ferramenta na figura abaixo.
![]() |
Interface do Process Explorer. (Fonte: Autor do documento) |
É
possível fazer o download da ferramenta no site da Microsoft.
Bom
pessoal, Por
hoje é só!
Até a
próxima!
Fonte:
BURLESON CONSULTING - ORAKILL TIPS. Disponível em:
http://fabalvesdba.blogspot.com.br/2011/12/orakill-o-assassino-de-processos-oracle.html.
Acessado: 01/02/2014.
FABIO
ALVES - ORAKILL - O Assassino de processos oracle no windows. Disponível em:
http://www.dba-oracle.com/tips_oracle_orakill.htm. Acessado: 30/01/2014.
DIOGO
NOMURA - Orakill. Disponível em:
http://dhnomura.blogspot.com.br/2009/02/orakill.html. Acessado: 01/02/2014.
SCOTT STEPHENS - Oracle Tip: Kill runaway Oracle
processes on Windows with OraKill. Disponível
em:
http://www.techrepublic.com/article/oracle-tip-kill-runaway-oracle-processes-on-windows-with-orakill/.
Acessado: 01/02/2014.