代码改变世界

【oracle】锁相关脚本

2022-08-01 21:13  abce  阅读(125)  评论(0编辑  收藏  举报

#查看哪些表被锁住了

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;

 

#查看被锁住的对象和用户信息

SELECT c.owner,
       c.object_name,
       c.object_type,
       b.sid,
       b.serial#,
       b.inst_id,
       b.status,
       b.osuser,
       b.machine,
       'alter system kill session ''' || b.sid || ',' || b.serial# || ',@' ||b.inst_id || ''';'
  FROM gv$locked_object a, gv$session b, dba_objects c
 WHERE b.sid = a.session_id
   AND a.object_id = c.object_id
   and a.inst_id = b.inst_id;


#查看历史阻塞会话和锁信息

select v.sql_text, v.sql_fulltext, sub.*
  from v$sql v,
       (select sample_time,
               s.sql_id sql_id,
               session_state,
               blocking_session,
               owner || '.' || object_name || ':' ||
               nvl(subobject_name, '-') obj_name,
               s.program,
               s.module,
               s.machine
          from dba_hist_active_sess_history s, dba_objects o
         where sample_time between
               to_date('27/02/2019 07:30:02', 'DD/MM/YYYY HH24:MI:SS') and
               to_date('28/02/2019 15:10:02', 'DD/MM/YYYY HH24:MI:SS')
           and event = 'enq: TX - row lock contention'
           and o.data_object_id = s.current_obj#
         order by 1 desc) sub
 where sub.sql_id = v.sql_id;



#找到暂时阻塞的会话和锁定。

select s1.username || '@' || s1.machine || ' ( THIS SID=' || s1.sid ||' )  is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
       s2.sid || ' ) ' AS blocking_status
  from gv$lock l1, gv$session s1, gv$lock l2, gv$session s2
 where s1.sid = l1.sid
   and s2.sid = l2.sid
   and l1.BLOCK = 1
   and l2.request > 0
   and l1.id1 = l2.id1
   and l2.id2 = l2.id2;


#kill掉大于300秒的会话

SELECT 'kill -9 ' || p.spid,
       s.username,
       'alter system kill session ''' || SID || ',' || s.serial# || ''';'
  FROM v$session s, v$process p
 WHERE s.paddr = p.addr(+)
   AND s.SID IN (select sid
                   from v$sql_monitor
                  where status = 'EXECUTING'
                    and elapsed_time / 1000000 > 300
                    and username in ('MEHMET', 'SALIH'));
  
   
SELECT 'alter system kill session ''' || SID || ',' || s.serial# || ',@' ||
       inst_id || ''';',
       sid,
       username,
       serial#,
       process,
       NVL(sql_id, 0),
       sql_address,
       blocking_session,
       wait_class,
       event,
       p1,
       p2,
       p3,
       seconds_in_wait
  FROM gv$session s
 WHERE blocking_session_status = 'VALID'
    OR sid IN (SELECT blocking_session
                 FROM gv$session
                WHERE blocking_session_status = 'VALID');


#Oracle--找到被锁住的对象(非死锁)

SELECT a.sid, a.serial#, a.username, c.os_user_name
 , a.program, a.logon_time, a.machine, a.terminal
 , b.object_id, substr(b.object_name,1,40) object_name
 , DECODE(c.locked_mode,1, 'No Lock',
                        2, 'Row Share',
                        3, 'Row Exclusive',
                        4, 'Shared Table',
                        5, 'Shared Row Exclusive',
                        6, 'Exclusive') locked_mode
from v$session a, dba_objects b, v$locked_object c
where a.sid = c.session_id
and b.object_id = c.object_id;

 

#当前会话中查看引起行锁竞争的语句

select sw.event,
       sw.sid,
       sw.p1,
       sw.p2,
       sw.p3,
       s.ROW_WAIT_OBJ#,
       s.ROW_WAIT_FILE#,
       s.ROW_WAIT_BLOCK#,
       s.ROW_WAIT_ROW#,
       o.OWNER,
       o.OBJECT_NAME,
       o.OBJECT_ID,
       o.DATA_OBJECT_ID,
       o.OBJECT_TYPE,
       st.sql_id,
       st.sql_text
  from v$session_wait sw, v$session s, dba_objects o, v$sql st
 where sw.sid = s.sid
   and o.object_id = s.ROW_WAIT_OBJ#
   and (st.sql_id = s.sql_id or st.sql_id = s.prev_sql_id)
   and sw.event = 'enq: TX - row lock contention';

 

#从历史会话中查看引起行锁竞争的语句

select ash.sample_time,
       ash.instance_number,
       ash.user_id,
       u.username,
       ash.session_id,
       ash.session_serial#,
       ash.current_obj#,
       o.owner,
       o.object_name,
       o.object_type,
       ash.sql_id,
       ash.sql_opname,
       ash.wait_class,
       ash.program,
       ash.module,
       ash.blocking_session_status,
       ash.blocking_session,
       ash.blocking_session_serial#,
       ash.blocking_inst_id,
       st.inst_id,
       st.sql_text
  from dba_hist_active_sess_history ash,
       dba_users                    u,
       dba_objects                  o,
       gv_$sql                      st
 where to_char(ash.sample_time, 'YYYY-MM-DD hh24:mi:ss') between  '2022-03-22 13:30:00' and '2022-03-22 15:30:00'
   and ash.time_waited > 0
   and ash.session_state = 'WAITING'
   and ash.user_id = u.user_id
   and ash.current_obj# = o.object_id
   and st.sql_id = ash.sql_id
   and ash.event = 'enq: TX - row lock contention';

  

#单实例的会话阻塞

SELECT s1.username || '@' || s1.machine || ' ( SID=' || s1.sid ||
       ' )  is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
       s2.sid || ' ) ' AS blocking_status
  FROM v$lock l1, v$session s1, v$lock l2, v$session s2
 WHERE s1.sid = l1.sid
   AND s2.sid = l2.sid
   AND l1.BLOCK = 1
   AND l2.request > 0
   AND l1.id1 = l2.id1
   AND l2.id2 = l2.id2;

 

#单实例的会话阻塞,详细信息

SELECT vs.username,
       vs.osuser,
       vh.sid locking_sid,
       vs.status status,
       vs.module module,
       vs.program program_holding,
       jrh.job_name,
       vsw.username,
       vsw.osuser,
       vw.sid waiter_sid,
       vsw.program program_waiting,
       jrw.job_name,
       'alter system kill session ' || '''' || vh.sid || ',' || vs.serial# ||
       ''';' "Kill_Command"
  FROM v$lock                     vh,
       v$lock                     vw,
       v$session                  vs,
       v$session                  vsw,
       dba_scheduler_running_jobs jrh,
       dba_scheduler_running_jobs jrw
 WHERE (vh.id1, vh.id2) IN (SELECT id1, id2
                              FROM v$lock
                             WHERE request = 0
                            INTERSECT
                            SELECT id1, id2
                              FROM v$lock
                             WHERE lmode = 0)
   AND vh.id1 = vw.id1
   AND vh.id2 = vw.id2
   AND vh.request = 0
   AND vw.lmode = 0
   AND vh.sid = vs.sid
   AND vw.sid = vsw.sid
   AND vh.sid = jrh.session_id(+)
   AND vw.sid = jrw.session_id(+);

 

#RAC环境的会话阻塞

SELECT DISTINCT S1.USERNAME || '@' || S1.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S1.SID || ' ) IS BLOCKING ' ||
                S2.USERNAME || '@' || S2.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S2.SID || ' ) ' AS BLOCKING_STATUS
  FROM GV$LOCK L1, GV$SESSION S1, GV$LOCK L2, GV$SESSION S2
 WHERE S1.SID = L1.SID
   AND S2.SID = L2.SID
   AND S1.INST_ID = L1.INST_ID
   AND S2.INST_ID = L2.INST_ID
   AND L1.BLOCK > 0
   AND L2.REQUEST > 0
   AND L1.ID1 = L2.ID1
   AND L1.ID2 = L2.ID2;

 

#RAC环境的会话阻塞和对象信息

SELECT DISTINCT S1.USERNAME || '@' || S1.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S1.SID || ' ) IS BLOCKING ' ||
                S2.USERNAME || '@' || S2.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S2.SID || ' ) OBJ_ID:' || L1.ID1 ||
                ' OBJ_NAME:' || O.OBJECT_NAME AS BLOCKING_STATUS
  FROM GV$LOCK L1, GV$SESSION S1, GV$LOCK L2, GV$SESSION S2, DBA_OBJECTS O
 WHERE S1.SID = L1.SID
   AND S2.SID = L2.SID
   AND S1.INST_ID = L1.INST_ID
   AND S2.INST_ID = L2.INST_ID
   AND L1.ID1 = OBJECT_ID
   AND L1.ID1 = O.OBJECT_ID
   AND L1.BLOCK > 0
   AND L2.REQUEST > 0
   AND L1.ID1 = L2.ID1
   AND L1.ID2 = L2.ID2;

 

#RAC环境的会话阻塞,针对某个具体的对象

SELECT DISTINCT S1.USERNAME || '@' || S1.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S1.SID || ' ) IS BLOCKING ' ||
                S2.USERNAME || '@' || S2.MACHINE || ' ( INST=' ||
                S1.INST_ID || ' SID=' || S2.SID || ' ) OBJ_ID:' || L1.ID1 ||
                ' OBJ_NAME:' || O.OBJECT_NAME AS BLOCKING_STATUS
  FROM GV$LOCK L1, GV$SESSION S1, GV$LOCK L2, GV$SESSION S2, DBA_OBJECTS O
 WHERE S1.SID = L1.SID
   AND S2.SID = L2.SID
   AND S1.INST_ID = L1.INST_ID
   AND S2.INST_ID = L2.INST_ID
   AND L1.ID1 = OBJECT_ID
   AND L1.ID1 = O.OBJECT_ID
   AND L1.BLOCK > 0
   AND L2.REQUEST > 0
   AND L1.ID1 = L2.ID1
   AND L1.ID2 = L2.ID2
   AND object_id in (SELECT OBJECT_ID
                       FROM DBA_OBJECTS
                      WHERE OWNER = 'ABC'
                        AND OBJECT_NAME = 'XYZ');