quien-bloqueo-mi-sesion.pdf

Upload: felix-mateos-medrano

Post on 02-Mar-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/26/2019 quien-bloqueo-mi-sesion.pdf

    1/5

    15th July 2009

    Recientemente me encontr con el siguiente artculo de Natalka

    Roshak [http://www.orafaq.com/node/854] publicado en orafaq.com

    que espero les sea de utilidad.

    Cuando un usuario o desarrollador te dice que tiene su sesin

    bloqueada, entendiendo por bloqueo la ejecucin de una instruccin

    DML [http://en.wikipedia.org/wiki/Data_Manipulation_Language] la cual despus de lanzarla deja de

    responder sabes cuan til puede ser identificar no solo quien lo est haciendo, sino tambin cual

    objeto es mejor an, puedes identificar el registro exacto que tu sesin est esperando bloquear.

    Usar la tabla emp del esquema SCOTT. Abro una sesin de SQL*Plus y configuro los siguiente

    parmetrosSQL> set sqlprompt "SESION1> "

    SESION1> set linesize 200

    actualizo todos los registros

    SESION1> update emp

    2 set sal=1000*1.05;

    14 rows updated.

    []

    sin dar commitabro otra sesin de SQL*Plus actualizo la variableSQL> set sqlprompt "SESION2> "

    SESION2>

    y en esta actualizo slo un registro

    SESION2> update emp

    2 set sal=1000

    3 where empno=7369;

    despus de presionar ENTER no regresa de immediato al prompt, he aqu el bloqueo.

    En una nueva sesin de SQL*Plus revisas el contenido de v$lock que muestra los bloqueos que

    existen actualmente en la base as como la relacin entre quien bloquea a quien aunque no de manera

    explcita

    SQL> select * from v$lock;

    ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    -------- -------- ------- -- ------- ------- ------- --------- ------- -------

    ........ ........ ....... .. ....... ....... ....... ......... ....... .......2887B03C 2887B068 144 TX 196639 3891 0 6 323 0

    0E3CBE90 0E3CBEC0 144 TM 69948 0 3 0 323 0

    Quien bloque mi sesin?

    Creando el bloqueo

    Identificando la sesin que est bloqueando

    Pgina 1 de 5Quien bloque mi sesin?

    26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

  • 7/26/2019 quien-bloqueo-mi-sesion.pdf

    2/5

    0E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0

    27CF5D14 27CF5D54 137 TX 196639 3891 6 0 570 1

    observa la ltima columna BLOCK, si una sesin mantiene un bloqueo que a su vez bloquea a otra vers

    que BLOCK=1. Llendo ms all, puedes ver cul sesin es la que est siendo bloqueada comparando

    ID1e ID2. La sesin bloqueada tendr los mismos valores en ID1e ID2que la que bloquea, y, ya que

    est haciendo la peticin de bloqueo que no puede obtener, tendr REQUEST>0.

    En el query anterior puedes ver que el SID 137 est bloqueando al SID 144. SID 137 corresponde a

    SESION1 y SID 144 es SESION2 que est bloqueada.

    Para no hacer la comparacin slo viendo los datos de ese query puedes ejecutar lo siguiente

    SQL> select l1.sid || ESTA BLOQUEANDO || l2.sid

    2 from v$lock l1, v$lock l2

    3 where l1.block = 1

    4 and l2.request > 0

    5 and l1.id1 = l2.id1 6 and l1.id2 = l2.id2;

    L1.SID||ESTABLOQUEANDO||L2.SID

    -----------------------------------

    137 ESTA BLOQUEANDO 144

    mejor an, si se incluye la tabla v$sessionla informacin es an ms legible

    SQL> select s1.username || @ || s1.machine

    2 || ( SID= || s1.sid || ) esta bloqueando

    3 || s2.username || @ || s2.machine || ( SID= || s2.sid || ) as estado_bloqueos 4 from v$lock l1, v$session s1, v$lock l2, v$session s2

    5 where s1.sid = l1.sid

    6 and s2.sid = l2.sid

    7 and l1.block = 1

    8 and l2.request > 0

    9 and l1.id1 = l2.id1

    10 and l2.id2 = l2.id2;

    ESTADO_BLOQUEOS

    -------------------------------------------------------------------------------------------SCOTT@TESTSERVER ( SID=137 ) esta bloqueando SCOTT@TESTSERVER ( SID=144 )

    Hay an ms informacin en la tabla v$lock, pero para leerla, es neceario entender un poquito ms

    sobre los tipos de bloqueos y los crpticas columnas ID1eID2

    En este caso el tipo de bloqueo es DML exclusivo ya que fu yo quien lanz la instruccin que bloquea.

    Sin embargo, su puede obtener esta informacin de v$locksin tanto esfuerzo.

    Lo primero es ver la columna TYPE. Hay decenas de tipos de bloqueos, sin embargo, la gran mayora

    Tipo de bloqueo y las columnas ID1 / ID2

    Pgina 2 de 5Quien bloque mi sesin?

    26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

  • 7/26/2019 quien-bloqueo-mi-sesion.pdf

    3/5

    son de sistema. Estos ltimos por lo general son muy breves y no ayuda mucho ajustar el library cache,

    undo logs, etc. si te metes con v$lock.

    Slo hay tres tipos de bloqueos de usuario, TX, TM y UL. UL es un bloqueo definido por el usuario

    aquel definido con el paquete DBMS_LOCK. TX es un bloqueo de transaccin de registros; se

    obtiene cada vez que hay una transaccin para alterar datos, sin importar la cantidad de objetos que

    intervendrn en esa transaccin. Las columnas ID1e ID2apuntan a los segmentos de rollback y a latabla de entradas de transacciones de esa transaccin.

    TM es un bloqueo DML. Se obtiene cada vez que un objeto es alterado. La columna ID1 identifica el

    objeto en cuestin.

    Se puede ver ms informacin observando los modos de bloqueo TM y TX. Las columnas LMODE y

    REQUEST usan ambas la misma numeracin que los modos de bloqueo, en orden de exclusividadincremental: desde 0 para sin bloqueo, hasta 6 para bloqueo exclusivo. Una sesin debe hacerse de un

    bloqueo exclusivo TX para que pueda alterar los datos; LMODEser 6. Si no puede obtener el bloqueo

    exclusivo debido a que algunos de los registros que quiere alterar estn bloqueados por otra sesin,

    entonces har la peticin TX en modo exclusivo; LMODEser 0 ya que no est bloqueando, y REQUEST

    ser 6. Esto se puede observar en el query ejecutado anteriormente

    ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    -------- -------- ------- -- ------- ------- -------- -------- ------- -------

    2887B03C 2887B068 144 TX 196639 3891 0 6 323 0

    27CF5D14 27CF5D54 137 TX 196639 3891 6 0 570 1

    Observa en SESION2 que ID1e ID2, la cual est solicitando un bloqueo TX (LMODE=0, REQUEST=6),

    apunta hacia las entradas de transacciones y rollback de SESION1 que es lo que permite determinar la

    sesin que bloquea a SESION2.

    Es posible que te encuentres tambin con bloqueos TX en modo 4 de modo compartido(Shared). Si un

    bloqueo no encuentra ninguna entrada disponible en la Lista de Transacciones Invocadas(ITL - Interest

    Transaction List) y tiene registros que va a alterar, entonces la sesin obtiene un bloqueo TX en modo 4

    mientras espera por la entrada(ITL). Si notas que hay contencin sobre un objeto por bloqueos TX-4, es

    probable que necesites incrementar su parmetro INITRANS.

    Los bloqueos TM generalmente son requeridos y adquiridos en modo 3, tambin llamado registro

    compartido exclusivo(Shared-Row Exclusive) y modo 6. Las operaciones DDL

    [http://en.wikipedia.org/wiki/Data_Definition_Language] requieren de un bloqueo TM exclusivo. (Ntese que la

    instruccin CREATE TABLE no requiere de un bloqueo TM y no lo necesita ya que el objeto en

    cuestin no existe todava!) Las operaciones DML requieren de un bloqueo Shared-Row Exclusive. De

    los registros seleccionados arriba sobre v$lock, puedes ver por lo niveles de bloqueo TM que son de

    tipo DML

    ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

    -------- -------- ------- -- -------- -------- ------- -------- ------- -------

    0E3CBE90 0E3CBEC0 144 TM 69948 0 3 0 323 00E3CBE90 0E3CBEC0 137 TM 69948 0 3 0 570 0

    Modos de bloqueo

    Pgina 3 de 5Quien bloque mi sesin?

    26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

  • 7/26/2019 quien-bloqueo-mi-sesion.pdf

    4/5

    Ahora que sabemos que cada registro TM apunta a un objeto bloqueado, se puede usar el campo ID1

    para identificarlo.

    SQL> select object_name from dba_objects where object_id=69948;

    OBJECT_NAME---------------------------------------------------------------

    EMP

    A veces es suficiente con slo saber de cul objeto se trata; sin embargo, su puede ahondar an ms,

    identificando no solo el objeto, sino tambin el bloque de datos e incluso el registro exacto por el que

    espera SESION2.

    Esta informacin se obtiene de v$sessionmediante la entrada de la sesin bloqueada

    SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#

    2 from v$session

    3 where sid=144;

    ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#

    ------------- -------------- --------------- -------------

    69948 4 147 0

    esto regresa el ID del objeto, el nmero relativo de archivo, el bloque en el archivo de datos y el registro

    en el bloque que est esperando la sesin. Si estos datos te suenan conocidos, es porque estos son los

    cuatro componentes de un ROWID extendido. Se puede construir el ROWID extendido de dicho registro

    a partir de estos componentes usando el paquete DBMS_ROWID. La funcin ROWID_CREATE toma

    esos datos como argumentos para regresar el ROWID

    SQL> select do.object_name, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,

    2 dbms_rowid.rowid_create(1, row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#)

    3 from v$session s, dba_objects do

    4 where sid = 144

    5 and s.row_wait_obj# = do.object_id;

    OBJECT_NAM ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DB

    MS_ROWID.ROWID_C

    ---------- ------------- -------------- --------------- ------------- ------------------

    EMP 69948 4 147 0 AAARE8AAEAAAACTAAA

    con el cual podemos inspeccionar directamente el registro

    SQL> select * from scott.emp where rowid=AAARE8AAEAAAACTAAA;

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------

    7369 SMITH CLERK 7902 17-DEC-80 800 20

    Encontrando el objeto bloqueado

    Encontrando el registro bloqueado

    Pgina 4 de 5Quien bloque mi sesin?

    26/09/2015http://sartigas.blogspot.com.es/2009/07/quien-bloqueo-mi-sesion.html

  • 7/26/2019 quien-bloqueo-mi-sesion.pdf

    5/5

    Con lo anterior puedes identificar una sesin que est bloqueando y cmo llegar hasta el registro que

    est esperando la sesin bloqueada.

    Publicado 15th July 2009porEstergios Artigas

    Etiquetas: Oracle

    Salir

    Avisarme

    Introduce tu comentario...

    Comentar como: Unknown (Goo

    Publicar Vista previa

    5

    Ver comentarios

    Sam 1 de marzo de 2010, 18:13

    Responder

    Estergios Artigas 2 de marzo de 2010, 1:55

    Responder

    Sam 2 de marzo de 2010, 20:49Responder

    Moni 11 de abril de 2010, 21:45

    Responder

    Anonymous 21 de agosto de 2014, 11:24

    Responder

    Pgina 5 de 5Quien bloque mi sesin?

    26/09/2015h // i bl /2009/07/ i bl i i h l