Quando o banco apresenta um DeadLock o que fazer?

Olá, Galera!  Nesse artigo, falarei de umas das coisas que podem parar até o seu banco de dados de funcionar, o DeadLock.

O Deadlock, ocorre quando duas ou mais tarefas bloqueiam uma à outra
permanentemente, sendo que cada uma tem o bloqueio de um recurso, que
a outra tarefa está tentando bloquear.

Muitos dos artigos que encontramos, só nos fala de como identificar o problema. Aqui tentarei abordar como resolver o problema de maneira fácil. Para identificar um DeadLock no banco é necessário saber, qual usuário está causando tal problema.

Realizando a consulta para saber o Id do usuário:

Select a1.sid, ‘ esta bloqueando ‘, a2.sid
From v$lock a1, v$lock a2
Where a1.block = 1
And a2.request > 0
And a1.id1=a2.id1
And a1.id2=a2.id2

Realizando a consulta da sessão do id que está causando o Lock:

select sid, serial#
from v$session
where sid = 999;

Aqui coloquei o sid como 999, mas você trocará pelo sid que retornar na primeira consulta.Vamos agora matar o sid_number e o serial _number.

ALTER SYSTEM KILL SESSION ‘sid_number, serial_number’;

Nesse sql, troque o “sid_number” e o “serial_number”, pelos que a consulta anterior retornou, realizando assim o kill da Id que está dando lock na base.

Verifique agora se a sessão está realmente morta (killed), rodando a consulta abaixo:

select sid, status
from v$session
where sid=999;

Retornando nada, a operação foi concluída com êxito. Mas, caso retorne ainda a linha de lock, devemos seguir mais alguns procedimentos. Vamos identificar a sessão do processo do sistema operacional que toma conta da sessão. Temos que ter cuidado quando se usa o dispatchers.

Identificando a sessão

select spid
from v$process
where addr=(select paddr from v$session where sid=999);

 

Quando identificamos o processo, vamos ao shell do linux ou do unix como administrador root e:

kill -9 9999

Lembrando que o valor 9999, corresponde ao valor retornado para o SPID da consulta anterior.

Agora amigo, caso ainda continue a sessão ativa, é bom irmos para um último recurso.

Eliminando a sessão:

ALTER SYSTEM DISCONNECT SESSION ‘sid_number,serial_number’ IMMEDIATE;

Pronto estará finalizado a tarefa de eliminar a sessão do DeadLock.

Abraços e espero ter ajudado.

Créditos: Carlos Gomes - http://www.linkedin.com/pub/carlos-alberto-gomes/2a/965/57a




Sobre Rafael Bernardes

Profissional apaixonado por sua profissão, especialista e focado em virtualização. Fundador do CooperaTI e da empresa Bernardes Consultoria. Vai me encontrar aqui no CooperaTI, no forum de virtualização do Technet, Technet WIKI e nos eventos da comunidade em TI pelo Brasil.
Esta entrada foi publicada em Banco de dados e marcada com a tag , . Adicione o link permanente aos seus favoritos.

Deixe uma resposta