matar sesiones oracle
El otro día recibí una alerta acerca de algunos bloqueos en esta base de datos, esta consulta me parece mas funcional que las basadas en v$lock, puesto que es mas rápida:
SQL> SELECT * FROM dba_waiters where MODE_HELD <>'None' or MODE_REQUESTED <>'Share'; WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2 --------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ---------- 398 336 Transaction Exclusive Share 327692 9591040 397 336 Transaction Exclusive Share 327692 9591040 394 336 Transaction Exclusive Share 327692 9591040 373 336 Transaction Exclusive Share 327692 9591040 347 336 Transaction Exclusive Share 327692 9591040 333 336 Transaction Exclusive Share 327692 9591040 316 336 Transaction Exclusive Share 327692 9591040 294 336 Transaction Exclusive Share 327692 9591040 293 336 Transaction Exclusive Share 327692 9591040 242 336 Transaction Exclusive Share 327692 9591040 201 336 Transaction Exclusive Share 327692 9591040 197 336 Transaction Exclusive Share 327692 9591040 194 336 Transaction Exclusive Share 327692 9591040 172 336 Transaction Exclusive Share 327692 9591040 88 336 Transaction Exclusive Share 327692 9591040 57 336 Transaction Exclusive Share 327692 9591040 13 336 Transaction Exclusive Share 327692 9591040 17 rows selected.
Como se puede ver, la sessión 336 es la que está bloqueando a las demás
Así que se me pidió matar la sesión
Como para matar una session es necesario conocer el SERIAL# además de el SID de la sessión hago:
SQL> SELECT SID, SERIAL#, STATUS, SERVER FROM V$SESSION WHERE SID=336; SID SERIAL# STATUS SERVER ----- ---------- ---------- --------- 336 40580 ACTIVE DEDICATEDY luego con esta información la meto en el " alter kill" para matarla...
SQL>ALTER SYSTEM KILL SESSION '=336,40580'; Statement processed.
pero esta sesión estará corriendo hasta que se complete el rollback de oracle... esto es porque cuando se lanza una cualquier operación DML (Operaciones de modificación de datos), Oracle realiza los cambios directamente en la tabla aunque no hagas "commit", pasando los bloques modificados al tablespace de undo...
Este método es muy eficiente si al final de la transacción se hace commit, pero si se hace rollback la base de datos tiene que volver a pasar todos los datos del undo a la tabla y borrar los que ya ha escrito... imagina que tienes una DML corriendo durante dos horas, si a las dos horas la matas, esta hace rollback y tendrá que volver a escribir en la tabla de nuevo todos los datos que se había llevado al undo..
column SID format 9999 column SPID format 9999999 column USERNAME format a15 column PROCESS format 99999 column MACHINE format a15 column PROGRAM format a55 column STATUS format a10 col LOGON_TIME for a27 select S.INST_ID,S.SID, P.SPID, S.USERNAME, S.MACHINE, S.PROGRAM, S.STATUS, to_char(LOGON_TIME, 'Dy DD-Mon-YYYY HH24:MI:SS') LOGON_TIME from gv$session S, gv$process P where P.addr=S.paddr and S.INST_ID=P.INST_ID and S.SID=336;SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> INST_ID SID SPID USERNAME MACHINE PROGRAM STATUS LOGON_TIME ---------- ----- ------------ --------------- --------------- ------------------------------------------------------- ---------- --------------------------- 1 336 22569 ORA_app hostname02 serverSDM@hostname02 (TNS V1-V3) KILLED Fri 29-Sep-2017 17:04:18
Aquí podemos ver que la sesión está en estado killed.. para estimar cuanto va a tardar podemos consultar la vista V$SESSION_LONGOPS
Comentarios
Publicar un comentario