Q:查看锁表进程,及杀死所有锁表进程sql

发布时间 2023-09-02 06:25:55作者: 三年三班王小朋

 

查看锁表进程

SELECT DISTINCT decode(s.inst_id, 1, 'DB1', 2, 'DB2') 数据库服务器,
                decode(s.BLOCKING_SESSION,
                       '',
                       S.USERNAME,
                       '--' || s.USERNAME) 登陆用户名,
                O.OWNER || '.' || O.OBJECT_NAME 锁的对象,
                S.SID,
                decode(S.BLOCKING_SESSION,
                       '',
                       '根锁为此会话',
                       '根锁会话:' || S.BLOCKING_SESSION) 阻塞SID,
                S.BLOCKING_SESSION_STATUS STATUS,
                (CASE
                  WHEN SQL_TEXT IS NULL THEN
                   '(SID:' || S.SID || ')会话 SQL已跑完'
                  ELSE
                   '(SID:' || S.SID || ')会话 正执行SQL:' || SQL_.SQL_TEXT
                END) SQL_TEXT,
                s.CLIENT_INFO,
                LO.REQUEST,
                S.STATE,
                S.EVENT,
                S.MACHINE,
                S.LOGON_TIME,
                S.INST_ID,
                S.BLOCKING_SESSION,
     
                       'ALTER SYSTEM KILL SESSION ''' || S.SID || ',' ||
                       S.SERIAL# || ''';',
                       '' KILL
  FROM GV$SESSION S
  LEFT JOIN GV$SQL SQL_
    ON SQL_.SQL_ID = S.SQL_ID
   AND SQL_.INST_ID = S.INST_ID
  JOIN GV$LOCKED_OBJECT L
    ON L.SESSION_ID = S.SID
   AND L.INST_ID = S.INST_ID
  JOIN ALL_OBJECTS O
    ON L.OBJECT_ID = O.OBJECT_ID
  JOIN GV$LOCK LO
    ON (LO.BLOCK != 0 OR LO.REQUEST != 0)
WHERE LO.SID = L.SESSION_ID
   AND LO.SID = S.SID
   AND LO.INST_ID = L.INST_ID
   AND LO.INST_ID = S.INST_ID
ORDER BY s.inst_id, S.BLOCKING_SESSION, s.SID DESC;

/*****************************************

*Oracle数据库操作中,
*锁表查询以及解锁和kill操作
*****************************************/
--查看锁表记录条数
SELECT COUNT(*) FROM V$LOCKED_OBJECT;
--查看锁表记录
SELECT * FROM V$LOCKED_OBJECT;
--查看被锁表
SELECT B.OWNER, B.OBJECT_NAME, A.SESSION_ID, A.LOCKED_MODE
  FROM V$LOCKED_OBJECT A, DBA_OBJECTS B
WHERE B.OBJECT_ID = A.OBJECT_ID;
--查看锁表session
SELECT B.USERNAME, B.SID, B.SERIAL#, LOGON_TIME
  FROM V$LOCKED_OBJECT A, V$SESSION B
WHERE A.SESSION_ID = B.SID
ORDER BY B.LOGON_TIME;
--杀掉对应进程
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
--如果数据库级别杀不到进程
(Windows-->) orakill <sid> <spid>
(Linux-->) kill -9 <spid>
select a.sid, b.spid, b.pid
  from v$session a, v$process b
 where a.PADDR = b.ADDR
   and a.sid = 192;