segunda-feira, 5 de abril de 2010

QUEM ESPERA QUEM? ( LOCKS)

Olá pessoal , como vão todos, andeimeio sumido e isso é bem verdade.

Mas é que ultimamente andam ocorrendo algumas mudanças em termos de estrutura na equipe atual em que atuo que me deixaram meio desmotivado a escrever , porém vocês que são leitores deste Blog, aos quais serei eternamente grato, não tem nada a ver com isso.

Por essa razão trago aqui um Post bem light, sobre um script que ajudará a todos que tem problemas em identificar quem está esperando quem em caso de Lock's no seu Banco de Dados.

Espero que apreciem.

WAITING FOR WHAT???

Bem, é muito comun termos em nossos Bancos de Dados, sessões que estão constantemente gerando lock's, que como já foi visto aqui, é nada mais nada menos que uma forma de defesa do Banco de Dados com relação a integridade dos dados.

Pois bem, visto isso que tal sabermos como identificar quem por exemplo está esperando por outra sessão para que possa dar andamento ao seu próprio processo?

Seria excelente se eu estivesse munido deste script a anos atrás, (risos), já passei alguns perrengues quando não tinha muita experiencia para identificar esses "probleminhas", bom vamos ao que interessa.

Primeiro de tudo, vamos preparar o nosso Banco para nos dar suporte e nos fornecer essa informação, ok?

PASSO 1 - CRIANDO A VISÂO DBA_WAITERS

Para que possamos utilizar nosso script a seguir é necessário que tenhamos em nosso Banco de Dados Oracle , a visão DBA_WAITERS, que não está disponivel em todos os bancos, porém isso é fácil de se resolver, vamos ver como é?

Devemos rodar um script chmado catblock.sql que se encontra no nosso bom e velho diretório de administração, para quem usa plataformas "UNIX $ORACLE_HOME/rdbms/admin/" para os clientes do Bill Gates ( Windows) dentro da sua pasta de instalação no mesmo caminho "%ORACLE_HOME%\rdbms\admin".

Após cria-la vejamos como é sua cara :

desc dba_waiters
Nome Nulo? Tipo
----------------------------------------------------- -------- ------------------------------------
WAITING_SESSION NUMBER
HOLDING_SESSION NUMBER
LOCK_TYPE VARCHAR2(26)
MODE_HELD VARCHAR2(40)
MODE_REQUESTED VARCHAR2(40)
LOCK_ID1 NUMBER
LOCK_ID2 NUMBER

Feito isso seu Banco está preparado para lhe dar essas informações.


PASSO 2 - O SCRIPT

Então, já que temos tudo pronto em termos de estrutura, vejamos como é esse script tão milagroso, ( risos), notem abaixo que ele possui algumas pré formatações, é apenas para melhorar a aparencia na hora do OUTPUT, isso pode ser facilmente customizado por cada um , de acordo o próprio desejo :

col busername for a10 heading 'Holding|User'
col wusername for a10 heading 'Waiting|User'
col bsession_id heading 'Holding|SID'
col wsession_id heading 'Waiting|SID'
col mode_held for a10 heading 'Mode|Held'
col mode_requested for 999999 heading 'Mode|Requested'
col lock_id1 for 999999 heading 'Lock|ID1'
col lock_id2 for a15 heading 'Lock|ID2'
col type heading 'Lock|Type'

set lines 132 pages 59 feedback off echo off

ttitle 'Processes Waiting on Locks Report'
spool waiters.lst

select holding_session bsession_id,
waiting_session wsession_id,
b.username busername,
a.username wusername,
c.lock_type type,
mode_held,
mode_requested,
lock_id1,
lock_id2
from
sys.v_$session b,
sys.dba_waiters c,
sys.v_$session a
where
c.holding_session=b.sid
and
c.waiting_session=a.sid;

spool off;
pause press Enter to continue
clear columns
set lines 80 pages 22 feedback on
ttitle off

Eis acima o nosso amigo, este script você pode também encontra-lo nas edições dos Livros da Rampant, mais precisamente no livro de Power Scripts e Tunning, muito util eu diria pra quem quer aprender mais sobre Tunning e também sobre alguns macetes pra identificar alguns probleminhas diarios que podem ocorrer nos nossos Bancos.



Espero que tenham apreciado , muito obrigado mais uma vez aos que me acompanham e até a próxima.

Abraço!!!!