Parfois, pour une raison quelconque, on ne sait pas si quelle session est bloquée et quel est l'utilisateur qui a bloqué (généralement ce genre de problème est dû à un verrouillage de l'enregistrement, par exemple une personne veut faire un UPDATE et une autre personne veut faire un DELETE sur le même enregistrement). Pour savoir quelles sont les informations de la session, exécuter cette requête (connecter avec un user sys as sysdba):
select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKEUR'
from v$session a, dba_waiters b
where a.sid = b.holding_session
and a.status <> 'KILLED'
union
select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKER'
from v$session a, dba_waiters b
where a.sid = b.waiting_session
and a.status <> 'KILLED'
union
select USERNAME, OSUSER, PROGRAM, LOGON_TIME, MACHINE, MODULE, TO_NUMBER(NULL), SID, SERIAL#, 'SESSION'
from v$session
where username is not null
and status <> 'KILLED';
Si on veut KILLER une session bloquée, il suffit d'exécuter la requête suivante (dans notre exemple, le SID 145, serial 71).
ALTER SYSTEM KILL SESSION '145,71';
On peut faire également: SELECT * FROM DBA_BLOCKERS pour savoir quel est le ID de la session qui est bloqué ?.
select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKEUR'
from v$session a, dba_waiters b
where a.sid = b.holding_session
and a.status <> 'KILLED'
union
select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKER'
from v$session a, dba_waiters b
where a.sid = b.waiting_session
and a.status <> 'KILLED'
union
select USERNAME, OSUSER, PROGRAM, LOGON_TIME, MACHINE, MODULE, TO_NUMBER(NULL), SID, SERIAL#, 'SESSION'
from v$session
where username is not null
and status <> 'KILLED';
Si on veut KILLER une session bloquée, il suffit d'exécuter la requête suivante (dans notre exemple, le SID 145, serial 71).
ALTER SYSTEM KILL SESSION '145,71';
On peut faire également: SELECT * FROM DBA_BLOCKERS pour savoir quel est le ID de la session qui est bloqué ?.
Aucun commentaire:
Enregistrer un commentaire