Qué hacer cuando una tarea sobre una tabla está bloqueada en Oracle

daraya's picture

Estos pasos son los que se pueden seguir cuando hay una tarea que está bloqueada sobre una tabla de oracle, el material fue suministrado por paviles.
 

 


1.       Se ingresó a la base de datos de Oracle en modo super usuario:
sqlplus system/********** AS SYSDBA
 
2.       Nos encontramos que la tabla estaba bloqueada al tratar de borrarla normalmente:
DROP TABLE MYSCHEME.REP_RACK_CAPACIDAD;
DROP TABLE
MYSCHEME.REP_RACK_CAPACIDAD
                    *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified


3.       Se intenta bloquear la tabla en modo exclusivo, sin éxito:
LOCK TABLE  MYSCHEME.REP_RACK_CAPACIDAD IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE 
MYSCHEME.REP_RACK_CAPACIDAD IN EXCLUSIVE MODE NOWAIT
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified


4.       Para ver si hay tareas bloqueadas (lock) en reservas se utiliza el siguiente comando:
select mode_held from dba_dml_locks where owner='MYSCHEME'; 

MODE_HELD
-------------
Row-X (SX)
Row-X (SX)
Row-X (SX)
Row-X (SX)
Row-X (SX)
Row-X (SX)
Row-X (SX)
Row-X (SX)


5.       Se constata que hay tareas bloqueadas. El siguiente paso es ver la información relacionada con esas tareas, para ver si es sobre la tabla en cuestión:
SQL> set linesize 130
SQL> set pages 100
SQL> col username       format a20
SQL> col sess_id        format a10
SQL> col object format a25
SQL> col mode_held      format a10
SQL> select     oracle_username || ' (' || s.osuser || ')' username
    ,  s.sid || ',' || s.serial# sess_id
    ,  owner || '.' || object_name object
    ,  object_type
    ,  decode( l.block
       ,       0, 'Not Blocking'
       ,       1, 'Blocking'
       ,       2, 'Global') status
    ,  decode(v.locked_mode
      ,       0, 'None'
      ,       1, 'Null'
      ,       2, 'Row-S (SS)'
      ,       3, 'Row-X (SX)'
      ,       4, 'Share'
      ,       5, 'S/Row-X (SSX)'
      ,       6, 'Exclusive', TO_CHAR(lmode)) mode_held
   from       v$locked_object v
   ,  dba_objects d
   ,  v$lock l
   ,  v$session s
   where      v.object_id = d.object_id
   and        v.object_id = l.id1
   and        v.session_id = s.sid
   order by oracle_username
   ,  session_id
   /


6.       La consulta anterior arrojó la siguiente información:
USERNAME             SESS_ID    OBJECT                      OBJECT_TYPE         STATUS       MODE_HELD
-------------------- ---------- --------------------------- ------------------- ------------ ----------
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    70,53090   MYSCHEME.DATO_ENTRADA       TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)

50 rows selected.


7.       Por lo que las tareas a eliminar son:
MYSCHEME (daraya)    54,21757   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    66,51052   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    77,25741   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (oracle)    79,64909   MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    107,41701  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    131,21045  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)
MYSCHEME (daraya)    134,52439  MYSCHEME.REP_RACK_CAPACIDAD TABLE               Not Blocking Row-X (SX)

8.       Para eliminar las tareas se ejecutan los siguientes comandos:
SQL> alter system kill session '54,21757';
System altered.

SQL> alter system kill session '66,51052';
System altered.

...

SQL> alter system kill session '79,64909';
alter system kill session '79,64909'
*
ERROR at line 1:
ORA-00031: session marked for kill


9.       Todas excepto la tarea '79,64909' se pudieron borrrar. Se prueba mandando a eliminar la tarea con un IMMEDIATE para forzar la interrupción:
SQL> alter system kill session '79,64909' IMMEDIATE;
alter system kill session '79,64909' IMMEDIATE
*
ERROR at line 1:
ORA-00031: session marked for kill


10.   Utilizar el IMMEDIATE fracasa, por lo que se debe eliminar la tarea desde sistema operativo. Para lo cual, debe verse primero cuál es el SID de la tarea de oracle:
SQL> SELECT s.sid, p.spid, s.osuser, s.program
FROM   v$process p, v$session s
WHERE  p.addr = s.paddr;
  2    3    4    5    6    7
       SID SPID         OSUSER                         PROGRAM
---------- ------------ ------------------------------ ------------------------------------------------
       170 18417        oracle                         oracle@server2 (PMON)
       169 18419        oracle                         oracle@
server2 (PSP0)
       168 18421        oracle                         oracle@
server2 (MMAN)
       167 18423        oracle                         oracle@
server2 (DBW0)
       166 18425        oracle                         oracle@
server2 (LGWR)
       165 18427        oracle                         oracle@
server2 (CKPT)
       164 18429        oracle                         oracle@
server2 (SMON)
       163 18431        oracle                         oracle@
server2 (RECO)
       162 18433        oracle                         oracle@
server2 (CJQ0)
       161 18435        oracle                         oracle@
server2 (MMON)
       160 18437        oracle                         oracle@
server2 (MMNL)
        79 28173        oracle                         oracle@
server2 (J000)
        84 17591        oracle                         oracle@
server2 (J001)
        90 17621        daraya                         Control_de_Jobs.exe
       149 18509        oracle                         oracle@server2 (QMNC)
        82 16598        oracle                         sqlplus@server2 (TNS V1-V3)
       145 18537        oracle                         emagent@server2 (TNS V1-V3)
       144 18540        oracle                         emagent@server2 (TNS V1-V3)
       140 18546        oracle                         oracle@server2 (q000)
       134 17060                                       OMS
       139 18551        oracle                         oracle@server2 (q001)
        70 17381        oracle                         oracle@server1 (TNS V1-V3)
        50 14842        daraya                         SQL Developer
       158 18631                                       OMS
        59 9905         Administrator                  meteoroparser.exe
       156 18637                                       OMS
       143 18643                                       OMS
        88 11406        Administrator                  meteoroparser.exe
       108 16883        daraya                         VB6.EXE
       133 16885        daraya                         VB6.EXE

58 rows selected.

11. Se logra identificar la tarea con el id de oracle (79), y se debe ir al sistema operativo para eliminar la tarea 28173:
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
oracle@pantera:/usr/local/oracle/oracle/product/10.2.0/db_1/bin> exit
logout
pantera:~ # kill -9 28173


12. Luego se debe ingresar a oracle como super usuario y borrar la tabla (eso era lo que se quería hacer desde un principio):

SQL> drop table reservas.REP_RACK_CAPACIDAD;

Table dropped.