查询阻塞的常用语句

--谁阻塞了某个session(10g) (已验证)
SELECT sid,
       username,
       event,
       blocking_session,
       seconds_in_wait,
       wait_time
  FROM v$session
 WHERE state IN ('WAITING') AND wait_class <> 'Idle';
--语句2:查询谁阻塞了谁 (已验证)
---查询谁阻塞了谁 blocked_sql_id
/* Formatted on 2014/9/20 11:48:53 (QP5 v5.256.13226.35538) */
  SELECT    '节点 '
         || a_s.INST_ID
         || ' session '
         || a_s.sid
         || ','
         || a_s.SERIAL#
         || ' 阻塞了 节点 '
         || b_s.INST_ID
         || ' session '
         || b_s.SID
         || ','
         || b_s.SERIAL#
            blockinfo,
         a_s.INST_ID,
         a_s.SID,
         a_s.SCHEMANAME,
         a_s.MODULE,
         a_s.STATUS,
         '后为被阻塞信息',
         b_s.INST_ID blocked_inst_id,
         b_s.SID blocked_sid,
         b_s.SCHEMANAME blocked_SCHEMANAME,
         b_s.EVENT blocked_event,
         b_s.MODULE blocked_module,
         b_s.STATUS blocked_status,
         b_s.SQL_ID SQL语句ID,
         obj.owner 所有者,
         obj.object_name 阻塞的类型名,
         obj.OBJECT_TYPE 阻塞的类型,
         CASE
            WHEN b_s.ROW_WAIT_OBJ# <> -1
            THEN
               DBMS_ROWID.rowid_create (1,
                                        obj.DATA_OBJECT_ID,
                                        b_s.ROW_WAIT_FILE#,
                                        b_s.ROW_WAIT_BLOCK#,
                                        b_s.ROW_WAIT_ROW#)
            ELSE
               '-1'
         END
            blocked_rowid,                                       --被阻塞数据的rowid
         DECODE (obj.object_type,
                 'TABLE',    'select * from '
                          || obj.owner
                          || '.'
                          || obj.object_name
                          || ' where rowid='''
                          || DBMS_ROWID.rowid_create (1,
                                                      obj.DATA_OBJECT_ID,
                                                      b_s.ROW_WAIT_FILE#,
                                                      b_s.ROW_WAIT_BLOCK#,
                                                      b_s.ROW_WAIT_ROW#)
                          || '''',
                 NULL)
            查询阻塞数据
    FROM gv$session a_s, gv$session b_s, dba_objects obj
   WHERE     b_s.BLOCKING_INSTANCE IS NOT NULL
         AND b_s.BLOCKING_SESSION IS NOT NULL
         AND a_s.INST_ID = b_s.BLOCKING_INSTANCE
         AND a_s.SID = b_s.BLOCKING_SESSION
         AND b_s.ROW_WAIT_OBJ# = obj.object_id(+)
ORDER BY a_s.inst_id, a_s.sid
--查询谁阻塞了谁 带被阻塞的SQL语句
/* Formatted on 2014/9/20 11:50:30 (QP5 v5.256.13226.35538) */
SELECT /*+ ORDERED */
      '阻塞者:('
       || A1.SID
       || ':'
       || A1.SCHEMANAME
       || ')-SQL:'
       || C1.SQL_TEXT
          BLOCKERS,
       A1.MACHINE,
       A1.PROGRAM,
       A1.LOGON_TIME,
          '等待者:('
       || A.SID
       || ':'
       || A.SCHEMANAME
       || ')-SQL:'
       || C.SQL_TEXT
          WAITERS,
       A.MACHINE AS W_MACHINE,
       A.PROGRAM AS W_PROGRAM,
       A.LOGON_TIME AS W_LOGON_TIME
  FROM V$LOCK B,
       V$SESSION A,
       V$SQLAREA C,
       V$LOCK B1,
       V$SESSION A1,
       V$SQLAREA C1
 WHERE     A.LOCKWAIT = B.KADDR
       AND C.HASH_VALUE(+) = A.SQL_HASH_VALUE
       AND B1.REQUEST = 0
       AND A1.USERNAME IS NOT NULL
       AND A1.SID = B1.SID
       AND C1.HASH_VALUE(+) = A1.SQL_HASH_VALUE
       AND B1.ID1 = B.ID1
--查询生成阻塞树(发生TM锁等待)
/* Formatted on 2014/9/20 11:50:55 (QP5 v5.256.13226.35538) */
  SELECT /*+ RULE */
        LPAD ('--', DECODE (B.BLOCK, 1, 0, 4)) || S.USERNAME USER_NAME,
         B.TYPE,
         O.OWNER || '.' || O.OBJECT_NAME OBJECT_NAME,
         S.SID,
         S.SERIAL#,
         DECODE (B.REQUEST, 0, 'BLOCKED', 'WATITING') STATUS,
         S.EVENT
    FROM DBA_OBJECTS O,
         V$SESSION S,
         V$LOCK V,
         V$LOCK B
   WHERE     V.ID1 = O.OBJECT_ID
         AND V.SID = S.SID
         AND V.SID = B.SID
         AND (B.BLOCK = 1 OR B.REQUEST > 0)
         AND V.TYPE = 'TM'
ORDER BY B.ID2, V.ID1, USER_NAME DESC;
--kill掉这个死锁的进程: 
alter system kill session 'sid,serial#'; (其中sid=l.session_id)
--锁表
/* Formatted on 2014/9/20 11:51:26 (QP5 v5.256.13226.35538) */
  SELECT /*+   RULE   */
        LPAD ('   ', DECODE (L.XIDUSN, 0, 3, 0)) || L.ORACLE_USERNAME
            USER_NAME,
         O.OWNER,
         O.OBJECT_NAME,
         O.OBJECT_TYPE,
         --DECODE(L.TYPE,   'TM ',   'TABLE   LOCK ',   'TX ',   'ROW   LOCK ',   NULL)   LOCK_LEVEL,
         DECODE (
            L.LOCKED_MODE,
            0, '[0]   NONE ',
            1, '[1]   NULL   空 ',
            2, '[2]   ROW-S   行共享(RS):共享表锁,SUB   SHARE   ',
            3, '[3]   ROW-X   行独占(RX) :用于行的修改,SUB   EXCLUSIVE   ',
            4, '[4]   SHARE   共享锁(S):阻止其他DML操作,SHARE ',
            5, '[5]   S/ROW-X   共享行独占(SRX):阻止其他事务操作,SHARE/SUB   EXCLUSIVE   ',
            6, '[6]   EXCLUSIVE   独占(X):独立访问使用,EXCLUSIVE   ',
            '[ ' || L.LOCKED_MODE || ']   OTHER   LOCK ')
            LOCKMODE,
         S.SID,
         S.SERIAL#,
         S.SQL_ADDRESS,
         S.PROGRAM,
         S.MACHINE,
         S.SQL_HASH_VALUE
    FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
   WHERE L.OBJECT_ID = O.OBJECT_ID AND L.SESSION_ID = S.SID
ORDER BY O.OBJECT_ID, XIDUSN DESC;
--可以选择杀掉这个进程
alter system kill session '142,211';
------------------------------------------------------------------------------------------------------
---1)查找死锁的进程:
SELECT s.username,
       l.object_id,
       l.session_id,
       s.serial#,
       l.oracle_username,
       l.os_user_name,
       l.process,
       'alter system kill session ''' || l.session_id || ',' || s.serial# || '''' as killSQL
  FROM v$locked_object l, v$session s
 WHERE l.session_id = s.SID
 
--2)kill掉这个死锁的进程: 
alter system kill session 'sid,serial#'; (其中sid=l.session_id) 
--3)如果还不能解决: 
select pro.spid
  from v$session ses, v$process pro
 where ses.sid = 525
   and ses.paddr = pro.addr;
--- 直接kill 这个进程解决
  ps -ef| grep spid
[oracle@tan ~]$ ps -ef| grep 3813
oracle    3813  3811  0 19:16 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    4049  3910  0 19:48 pts/5    00:00:00 grep 3813
[oracle@tan ~]$ kill -9 3813  3811
/* 生成kill语句) */
SELECT a_s.owner,
       a_s.object_name,
       a_s.object_type,
       VN.SID,
       VN.SERIAL#,
       DECODE (V_T.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 (V_T.LOCKED_MODE))
          MODE_LOCKED,
       VS.SPID "OS_PID",
       VN.PROCESS "CLIENT_PID",
       VN.USERNAME,
       VN.OSUSER,
       VN.MACHINE "HOSTNAME",
       VN.TERMINAL,
       VN.PROGRAM,
       TO_CHAR (VN.LOGON_TIME, 'YYYY-MM-DD HH24:MI:SS') "LOGIN_TIME",
       'alter system kill session ''' || vn.sid || ',' || vn.serial# || ''';'
          "ORACLE_KILL",
       'kill -9 ' || VS.SPID "OS_KILL"
  FROM ALL_OBJECTS A_S,
       V$LOCKED_OBJECT V_T,
       V$SESSION VN,
       V$PROCESS VS
 WHERE     A_S.OBJECT_ID = V_T.OBJECT_ID
       AND V_T.SESSION_ID = VN.SID
       AND VS.ADDR = VN.PADDR;




posted on 2015-01-23 14:14  夜拿水果刀  阅读(525)  评论(0编辑  收藏  举报

导航