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.