miércoles, 1 de octubre de 2014

library cache lock

Hallé la idea para este ejemplo aquí y decidí hacer una traducción  para los hispanohablantes. 

Esto pasó en Oracle versión 11.1. Para empezar, noté el SID de la sesión roja bajo estas líneas. Se puede ver porque hice esto más tarde: 

SQL> l
  1* select distinct sid from v$mystat
SQL> /
 
       SID
----------
       155

SQL>

Luego intenté cambiar la definición de una columna pero nada pasaba:

SQL> alter session
  2  set ddl_lock_timeout = 3600
  3  /
 
Session altered.
 
SQL> alter table srce.pb_tolerance_charge
  2  modify (mg_abv null)
  3  /

Entonces, en la segunda sesión azul, verifiqué que la sesión roja esperaba y noté que la causa del retraso era un library cache lock:

SQL> l
  1  select wait_time, event
  2  from v$session
  3* where sid = 155
SQL> /
 
WAIT_TIME EVENT
---------- --------------------
         0 library cache lock
 
SQL>

Hice un reportaje del estado del sistema de la manera siguiente:
 
SQL> conn / as sysdba
Connected.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug unlimit
Statement processed.
SQL> oradebug dump systemstate 10
Statement processed.
SQL>

Hallé el reportaje en el directorio que contenía el archivo de alert y los otros archivos .trc:

PQECOG4 /oracle/app/oracle/product/diag/rdbms/pqecog4/PQECOG4/trace > ls -l PQECOG4_ora_1890.trc
-rw-r-----   1 oracle   dba      25412891 Jul 10 11:54 PQECOG4_ora_1890.trc
PQECOG4 /oracle/app/oracle/product/diag/rdbms/pqecog4/PQECOG4/trace >

Busqué las palabras library cache lock en el reportaje del estado del sistema y verifiqué que el SID era 155:

    (session) sid: 155 ser: 2275 trans: 0x3904dd858, creator: 0x3924f0450
              flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
              flags2: (0x4008) DDLT1/-
              DID: , short-term DID:
              txn branch: 0x0
              oct: 15, prv: 0, sql: 0x38b2bede8, psql: 0x387dca5d0, user: 74/ELEC_ORACLE
    client details:
      O/S info: user: oracle, term: pts/18, ospid: 18140
      machine: zge-mktred-ddb2 program: sqlplus@zge-mktred-ddb2 (TNS V1-V3)
      application name: SQL*Plus, hash value=3669949024
    Dumping Current Wait Stack:
     0: waiting for 'library cache lock'
        handle address=38b2557a8, lock address=38b04c6d8, 100*mode+namespace=12d
        wait_id=1683 seq_num=1684 snap_id=1
        wait times (usecs) - snap=185051570 exc=185051570 total=185051570
        wait times (usecs) - max=infinite
        wait counts (exc) - calls=65 os=65
        in_wait=1 iflags=0x15a2
    There is at least one session blocking this session.
    Dumping one blocker:
      inst: 1, sid: 192, ser: 6553

Vi que la sesión 192 bloqueaba la sesión 155 y por eso la maté:

SQL> alter system kill session '192,6553' immediate
  2  /
 
System altered.
 
SQL> 

… entonces el cambio de la definición de la columna se terminó: 

SQL> alter table srce.pb_tolerance_charge
  2  modify (mg_abv null)
  3  /
 
Table altered.
 
SQL>

No hay comentarios:

Publicar un comentario