不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

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

Posted on 2023-09-02 06:24  三年三班王小朋  阅读(156)  评论(0编辑  收藏  举报

 查看锁表进程

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;
 
##查询锁表的sql(需要输入查询sid)
select username, sql_text, machine, osuser
from v$session a, v$sqltext_with_newlines b
where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value) =
b.hash_value
and a.sid = &sid
order by piece;
##查询正在执行的sql
SELECT s.sid,
       s.serial#,
       s.username,
       spid,
       v$sql.sql_id,
       machine,
       s.terminal,
       s.program,
       sql_text
  FROM v$process, v$session s, v$sql
 WHERE addr = paddr
   and s.sql_id = v$sql.sql_id
   AND sql_hash_value = hash_value