Página Inicial > Scripts > Verificando lock’s no Oracle e matando/fechando a sessão

Verificando lock’s no Oracle e matando/fechando a sessão

No banco de dados Oracle, quando executamos alguma operação DML (update, insert, delete) nós estamos lockando os dados para a edição, isto impede que as aplicações e/ou até mesmo usuários não fazem alteração na mesma tabela/linha que você. Lembramos que existe o lock de tabela e o lock de linha. O lock pode causar travamento, parada, sem resposta do select, etc.

Vamos fazer uma simulação para sabermos como tratar este tipo de problema comum, que acontece muito nos ambientes de desenvolvimento e homologação:

Criando uma tabela

SQL> create table t (a char(1));
Table created.

Inserido dados:

SQL> insert into t values (‘w’);
1 row created.

Se não dermos um commit ou sair da sessão, esta tabela fica lockada.

Vamos abrir uma outra conexão com o banco de dados e manter este putty conectado e parado na inserção de dados. Para exibir os objetos lockados, podemos rodar este script, ele irá mostrar informações como: owner, session_id, object_name, etc. No sistema operacional, vamos criar um arquivo chamado verificalock.sql e após criar este arquivo, acessamos via sqlplus e rodamos com @verificalock.sql.

set wrap off
set lines 130
set pages 100
col owner format a12 heading ‘Owner’
col session_id format 9999 heading ‘Sid’
col object_type format a20 heading ‘Type’
col object_name format a30 heading ‘Objeto’
col oracle_username format a15 heading ‘Username’
col os_user_name format a15 heading ‘OS user’

select l.SESSION_ID,
o.owner,
o.object_type,
o.object_name,
l.oracle_username,
l.os_user_name
FROM gv$locked_object l,
dba_objects o
WHERE l.object_id = o.object_id
ORDER by l.SESSION_ID,o.object_name;

Vejamos na prática esta tarefa:

Agora vamos criar o script matasessao.sql e adicionar as seguintes linhas:

set serveroutput on
set verify off
set feed off

prompt
prompt Elimina Sessao
prompt ==============
prompt
accept v_sid number prompt ‘Entre com o SID da sessao: ‘
prompt

begin
for lst in (select s.sid, s.serial#, s.username, s.osuser, s.machine, s.program,
i.instance_name, i.host_name, p.spid, s.sql_hash_value, s.status
from v$session s, v$process p, v$instance i
where s.sid = &v_sid
and s.paddr = p.addr ) loop
dbms_output.put_line(‘Sid…………..: ‘ || lst.sid);
dbms_output.put_line(‘Serial#……….: ‘ || lst.serial#);
dbms_output.put_line(‘Status………..: ‘ || lst.status);
dbms_output.put_line(‘Username………: ‘ || lst.username);
dbms_output.put_line(‘Maquina……….: ‘ || lst.machine);
dbms_output.put_line(‘Programa………: ‘ || lst.program);
dbms_output.put_line(‘OS User……….: ‘ || lst.osuser);
dbms_output.put_line(‘Host………….: ‘ || lst.host_name);
dbms_output.put_line(‘Instance………: ‘ || lst.instance_name);
dbms_output.put_line(‘SQL Hash Value…: ‘ || lst.sql_hash_value);
dbms_output.put_line(‘PID…………..: ‘ || lst.spid);
end loop;
end;
/

prompt
accept v_conf prompt ‘Voce quer realmente eliminar esta sessao (S/N)? ‘
prompt

begin
if ‘&v_conf’ in (‘S’, ‘s’) then
for lst in (select sid, serial# from v$session where sid = &v_sid) loop
execute immediate ‘alter system kill session ”’ || lst.sid || ‘,’ || lst.serial# || ”’ immediate’;
dbms_output.put_line(‘Sessao eliminada !’);
end loop;
end if;
end;
/

prompt

— Restaura configuracao do sqlplus

set feed on


— Fim

Para chamar o script devemos colocar um arroba (@) no começo do script, lembrando que você deve estar na mesma pasta onde se encontra o arquivo.
A imagem abaixo mostra o script sendo executado, no momento que rodamos, ele irá pedir o SID que obtemos com o script @verificalock, após colocarmos o SID ele mostra alguns dados da sessão, tais como: máquina, serial#, usuário, host, instancia, etc. E por fim, ele pergunta se você deseja deslockar a sessão:

Por fim, como mostra na imagem acima, verificamos que não existe mais lock no banco de dados.

Tags:
  1. Marisa do Carmo
    25, setembro, 2013 em 16:28 | #1

    Muito bom, deve ser por causa do sobrenome… brincadeira. Parabéns, ótimo post.

  1. Nenhum trackback ainda.