Muito obrigado Alessandro, irá ajudar muito!!!
Em Quarta-feira, 13 de Abril de 2016 11:42, "Alessandro Lúcio Cordeiro da
Silva [email protected] [oracle_br]" <[email protected]>
escreveu:
Bom dia Rafael,
Problemas de Lock, em geral é problema da aplicação, mas temos que pelo menos
provar isso, o que não é tão fácil devido não conhecemos os meandros de um
sistema.
Bom, dizer que a sessão A esta bloqueando a sessão B não traz muita luz, então
o que eu normalmente faço é criar uma rotina que disparava por um JOB em 10 a
10 segundos, por exemplo, me traga quais são os objetos estão sendo locados, e
se for uma tabela me traga o ROWID da linha em questão. E se o programa for
escrito em packages/function/procedures PLSQL me traga o programa e a linha que
ocorreu o lock.
Neste cenário eu crio um schema chamado monitora, e crio a uma tabela que terá
os LOCKS e a procedure, espero que ajude:
TABELA :
create table ROWLOCK
( RLODATE DATE, SID_BLOCK NUMBER(6), SERIAL_BLOCK
NUMBER(6), USER_BLOCK VARCHAR2(30), MODULE_BLOCK VARCHAR2(50),
PROGRAM_BLOCK VARCHAR2(50), TERMINAL_BLOCK VARCHAR2(50), SID_WAIT
NUMBER(6), SERIAL_WAIT NUMBER(6), USER_WAIT VARCHAR2(30),
MODULE_WAIT VARCHAR2(50), PROGRAM_WAIT VARCHAR2(50), TERMINAL_WAIT
VARCHAR2(50), SECONDS_IN_WAIT NUMBER(6), EVENT_WAIT VARCHAR2(64),
OBJ_LOCADO VARCHAR2(60), ROWID_WAIT VARCHAR2(30), OBJETO_PLSQL
VARCHAR2(60), OBJETO_TYPE VARCHAR2(30), TEXTO_SQL CLOB);
create index INDX_SIDSERIAL on ROWLOCK (SID_BLOCK, SERIAL_BLOCK, SID_WAIT,
SERIAL_WAIT);
procedure registra_espera_por_lock is /* create table monitora.rowlock
(rlodate date default sysdate, -- DataHora que foi detectado o LOCK
SID_BLOCK number(6), -- SID do usuario que esta bloqueando o
acessso serial_block number(6), -- Seria do usuario que esta
bloqueando o acessso user_block varchar2(30), -- Usuario que
esta bloqueando o acessso sid_wait number(6), -- SID de que
esta esperando acessar a tabela serial_wait number(6), --
Seria de que esta esperando acessar a tabela user_wait varchar2(30),
-- USuário que esta esperando acessar a tabela seconds_in_wait
number(6), -- Tempo sem Segundos de espera tabela_wait
varchar2(60), -- Nome da Tabela que esta em LOCK rowid_wait
varchar2(30), -- ROWID da tabela que esta em LOCK objeto_plsql
varchar2(60), -- Se o SQL de espera esta dentro de uma rotina PLSQL,
irar retornar o nome. objeto_type varchar2(30), -- Se é Pacote,
trigger, função procedure; modulo varchar2(50), -- Nome do
modulo que esta esperando, se a sessão cliente setou o contexto programa
varchar2(50), -- Nome do programa que esta esperando, se a sessão
cliente setou o contexto terminal varchar2(50), -- Nome da
maquina onde ocorre a espera. texto_sql clob -- SQL
que esta aguardado o LOCK event varchar2(64) -- Nome do
Evento de Espera ); */ cursor c_espera_por_lock is select k.sid
sid_block, k.serial# seria_block, k.username
user_block, k.module module_block, k.program
program_block, k.terminal terminal_block,
---------------------------- v.sid sid_wait,
v.serial# seria_wait, v.username user_wait,
v.module module_wait, v.program
program_wait, v.terminal terminal_wait,
v.seconds_in_wait seconds_wait, v.event event_wait,
v.sql_id, do.owner||'.'||do.object_name obj_locado,
do.OBJECT_TYPE OBJECT_TYPE_locado, do2.object_type
OBJETO_PLSQL_type, do2.owner||'.'||do2.object_name OBJETO_PLSQL,
--, k.PLSQL_OBJECT_ID 'alter system kill session
'''||v.blocking_session||','||substr(ltrim(to_char(k.serial#,'99999')),1,5)||''';'
KILL_EM_BLOCK, v.row_wait_obj#, v.row_wait_file#,
v.row_wait_block#, v.row_wait_row# from v$session v, v$session k,
dba_objects do, dba_objects do2 where v.blocking_session = k.sid
and v.row_wait_obj# = do.object_id(+) and
v.PLSQL_ENTRY_OBJECT_ID = do2.object_id(+) and v.blocking_session is
not null --and v.event = 'enq: TX - row lock contention' and (
( ( k.WAIT_TIME = 0 and k.seconds_in_wait >= 5
) or ( k.WAIT_TIME <> 0 and (k.SECONDS_IN_WAIT - k.WAIT_TIME /
100) >= 5) ) OR --- OU (
( v.WAIT_TIME = 0 and v.seconds_in_wait >= 5 ) or (
v.WAIT_TIME <> 0 and (v.SECONDS_IN_WAIT - v.WAIT_TIME / 100) >= 5)
) ); v_rowid_wait varchar2(30); v_sysdate
date := sysdate; v_qtde integer; begin
for c in c_espera_por_lock loop
if c.OBJECT_TYPE_locado in ('TABLE', 'MVIEW', 'VIEW') then begin
v_rowid_wait := dbms_rowid.rowid_create ( 1, c.row_wait_obj#,
c.row_wait_file#, c.row_wait_block#, c.row_wait_row# ); exception
when others then v_rowid_wait := null; end; end if;
/*if c.seconds_in_wait >= 300 then -- Se for mais de 5 minutos de espera,
mata a sessão que esta bloqueando o registro... execute immediate
c.KILL_EM_BLOCK; continue; end if;*/
insert into monitora.rowlock (RLODATE,
SID_BLOCK, SERIAL_BLOCK,
USER_BLOCK, MODULE_BLOCK,
PROGRAM_BLOCK,
TERMINAL_BLOCK, SID_WAIT,
SERIAL_WAIT, USER_WAIT,
MODULE_WAIT,
PROGRAM_WAIT, TERMINAL_WAIT,
SECONDS_IN_WAIT,
EVENT_WAIT, OBJ_LOCADO,
ROWID_WAIT, OBJETO_PLSQL,
OBJETO_TYPE,
TEXTO_SQL) values (v_sysdate, c.sid_block,
c.seria_block, c.user_block, c.module_block,
c.program_block, c.terminal_block,
c.sid_wait, c.seria_wait, c.user_wait,
c.module_wait, c.program_wait,
c.terminal_wait, c.seconds_wait, c.event_wait,
c.obj_locado, v_rowid_wait,
c.objeto_plsql, c.objeto_plsql_type, (select
s.SQL_FULLTEXT from v$sql s where sql_id = c.sql_id and rownum =1));
commit;
end loop; end registra_espera_por_lock;
Alessandro Lúcio Cordeiro da Silva
Analista de Sistema
þ http://alecordeirosilva.blogspot.com/
Porque esta é a vontade de Deus, a saber, a vossa
santificação: que vos abstenhais da prostituição.
(1º Tessalonicenses 4:3)
Em Quarta-feira, 13 de Abril de 2016 9:37, "Rafael Mendonca
[email protected] [oracle_br]" <[email protected]> escreveu:
Senhores, bom dia.
Cenário:
Oracle Enterprise Edition 11.2.0.4 - ASM Single Instance - RH 6.0
Problema:
Um determinado sistema que atende diversos estados do Brasil (cada um com seu
database individual com as mesmas características citadas acima) está tendo um
grande problema de LOCK de transação há uns 4 meses. Em conversa com a equipe
de desenvolvimento nada mudou. No banco de dados também nada foi alterado. O
engraçado é que esse mesmo sistema em outros estados não está ocorrendo esse
problema de Lock TX, somente em um estado o problema de LOCK está muito
agravante.
Monitoramento:
O que fiz foi monitorar vários aspectos do database. Primeiramente a
V$SESSION_WAIT, depois a V$SESSION_EVENT e a V$SYSTEM_EVENT. Realmente a campeã
dos eventos em espera é a enq: TX - row lock contention.
Após a primeira análise, verifiquei as sessões ativas dos usuários que estavam
sendo locados. Detectei que é sempre um UPDATE em DIVERSAS tabelas do sistema.
Não é em um uma tabela ou específica ou duas, são em várias. Passei as
informações para a equipe de desenvolvimento verificar a possibilidade de
colocar o COMMIT; logo após algumas instruções (no caso os UPDATES detectados),
mesmo assim não adiantou.
Expliquei para o cliente que o grande problema de lock de transação é
justamente o DESIGN da aplicação. Que isso é um comportamento normal do RDBMS
Oracle, entre outros RDBMS. Mas o que o cliente questiona, é que antes não
existia esse problema de lock, e que o mesmo sistema atende outros estados e o
problema não se replica nesses estados.
Portanto, peço ajuda aos senhores para que possam me ajudar com suas
expertises. Não sei mais o que fazer em relação a esse problema.
#yiv0991738973 #yiv0991738973 -- #yiv0991738973ygrp-mkp {border:1px solid
#d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv0991738973
#yiv0991738973ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv0991738973
#yiv0991738973ygrp-mkp #yiv0991738973hd
{color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px
0;}#yiv0991738973 #yiv0991738973ygrp-mkp #yiv0991738973ads
{margin-bottom:10px;}#yiv0991738973 #yiv0991738973ygrp-mkp .yiv0991738973ad
{padding:0 0;}#yiv0991738973 #yiv0991738973ygrp-mkp .yiv0991738973ad p
{margin:0;}#yiv0991738973 #yiv0991738973ygrp-mkp .yiv0991738973ad a
{color:#0000ff;text-decoration:none;}#yiv0991738973 #yiv0991738973ygrp-sponsor
#yiv0991738973ygrp-lc {font-family:Arial;}#yiv0991738973
#yiv0991738973ygrp-sponsor #yiv0991738973ygrp-lc #yiv0991738973hd {margin:10px
0px;font-weight:700;font-size:78%;line-height:122%;}#yiv0991738973
#yiv0991738973ygrp-sponsor #yiv0991738973ygrp-lc .yiv0991738973ad
{margin-bottom:10px;padding:0 0;}#yiv0991738973 #yiv0991738973actions
{font-family:Verdana;font-size:11px;padding:10px 0;}#yiv0991738973
#yiv0991738973activity
{background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv0991738973
#yiv0991738973activity span {font-weight:700;}#yiv0991738973
#yiv0991738973activity span:first-child
{text-transform:uppercase;}#yiv0991738973 #yiv0991738973activity span a
{color:#5085b6;text-decoration:none;}#yiv0991738973 #yiv0991738973activity span
span {color:#ff7900;}#yiv0991738973 #yiv0991738973activity span
.yiv0991738973underline {text-decoration:underline;}#yiv0991738973
.yiv0991738973attach
{clear:both;display:table;font-family:Arial;font-size:12px;padding:10px
0;width:400px;}#yiv0991738973 .yiv0991738973attach div a
{text-decoration:none;}#yiv0991738973 .yiv0991738973attach img
{border:none;padding-right:5px;}#yiv0991738973 .yiv0991738973attach label
{display:block;margin-bottom:5px;}#yiv0991738973 .yiv0991738973attach label a
{text-decoration:none;}#yiv0991738973 blockquote {margin:0 0 0
4px;}#yiv0991738973 .yiv0991738973bold
{font-family:Arial;font-size:13px;font-weight:700;}#yiv0991738973
.yiv0991738973bold a {text-decoration:none;}#yiv0991738973 dd.yiv0991738973last
p a {font-family:Verdana;font-weight:700;}#yiv0991738973 dd.yiv0991738973last p
span {margin-right:10px;font-family:Verdana;font-weight:700;}#yiv0991738973
dd.yiv0991738973last p span.yiv0991738973yshortcuts
{margin-right:0;}#yiv0991738973 div.yiv0991738973attach-table div div a
{text-decoration:none;}#yiv0991738973 div.yiv0991738973attach-table
{width:400px;}#yiv0991738973 div.yiv0991738973file-title a, #yiv0991738973
div.yiv0991738973file-title a:active, #yiv0991738973
div.yiv0991738973file-title a:hover, #yiv0991738973 div.yiv0991738973file-title
a:visited {text-decoration:none;}#yiv0991738973 div.yiv0991738973photo-title a,
#yiv0991738973 div.yiv0991738973photo-title a:active, #yiv0991738973
div.yiv0991738973photo-title a:hover, #yiv0991738973
div.yiv0991738973photo-title a:visited {text-decoration:none;}#yiv0991738973
div#yiv0991738973ygrp-mlmsg #yiv0991738973ygrp-msg p a
span.yiv0991738973yshortcuts
{font-family:Verdana;font-size:10px;font-weight:normal;}#yiv0991738973
.yiv0991738973green {color:#628c2a;}#yiv0991738973 .yiv0991738973MsoNormal
{margin:0 0 0 0;}#yiv0991738973 o {font-size:0;}#yiv0991738973
#yiv0991738973photos div {float:left;width:72px;}#yiv0991738973
#yiv0991738973photos div div {border:1px solid
#666666;height:62px;overflow:hidden;width:62px;}#yiv0991738973
#yiv0991738973photos div label
{color:#666666;font-size:10px;overflow:hidden;text-align:center;white-space:nowrap;width:64px;}#yiv0991738973
#yiv0991738973reco-category {font-size:77%;}#yiv0991738973
#yiv0991738973reco-desc {font-size:77%;}#yiv0991738973 .yiv0991738973replbq
{margin:4px;}#yiv0991738973 #yiv0991738973ygrp-actbar div a:first-child
{margin-right:2px;padding-right:5px;}#yiv0991738973 #yiv0991738973ygrp-mlmsg
{font-size:13px;font-family:Arial, helvetica, clean, sans-serif;}#yiv0991738973
#yiv0991738973ygrp-mlmsg table {font-size:inherit;font:100%;}#yiv0991738973
#yiv0991738973ygrp-mlmsg select, #yiv0991738973 input, #yiv0991738973 textarea
{font:99% Arial, Helvetica, clean, sans-serif;}#yiv0991738973
#yiv0991738973ygrp-mlmsg pre, #yiv0991738973 code {font:115%
monospace;}#yiv0991738973 #yiv0991738973ygrp-mlmsg *
{line-height:1.22em;}#yiv0991738973 #yiv0991738973ygrp-mlmsg #yiv0991738973logo
{padding-bottom:10px;}#yiv0991738973 #yiv0991738973ygrp-msg p a
{font-family:Verdana;}#yiv0991738973 #yiv0991738973ygrp-msg
p#yiv0991738973attach-count span {color:#1E66AE;font-weight:700;}#yiv0991738973
#yiv0991738973ygrp-reco #yiv0991738973reco-head
{color:#ff7900;font-weight:700;}#yiv0991738973 #yiv0991738973ygrp-reco
{margin-bottom:20px;padding:0px;}#yiv0991738973 #yiv0991738973ygrp-sponsor
#yiv0991738973ov li a {font-size:130%;text-decoration:none;}#yiv0991738973
#yiv0991738973ygrp-sponsor #yiv0991738973ov li
{font-size:77%;list-style-type:square;padding:6px 0;}#yiv0991738973
#yiv0991738973ygrp-sponsor #yiv0991738973ov ul {margin:0;padding:0 0 0
8px;}#yiv0991738973 #yiv0991738973ygrp-text
{font-family:Georgia;}#yiv0991738973 #yiv0991738973ygrp-text p {margin:0 0 1em
0;}#yiv0991738973 #yiv0991738973ygrp-text tt {font-size:120%;}#yiv0991738973
#yiv0991738973ygrp-vital ul li:last-child {border-right:none
!important;}#yiv0991738973