数据库锁大于600秒的session的抓取

来源:互联网 发布:win10程序员桌面壁纸 编辑:程序博客网 时间:2024/05/18 00:53
create or replace procedure moni_lock is
begin
  insert /* +append */
  into moni_lock_block
    select seq_mlb.nextval, mkb.*
      from (select /*+rule*/
             do.OWNER || '.' || do.OBJECT_NAME,
             vs.LAST_CALL_ET,
             vs.USERNAME,
             vs.OSUSER,
             vs.MACHINE,
             vs.PROGRAM,
             vs.SID,
             '(' || vs.SID || ',' || vs.SERIAL# || ')',
             SYS_CONTEXT('USERENV', 'INSTANCE_NAME'),
             sysdate,
             vsq.SQL_TEXT
              from v$lock          a,
                   v$session       vs,
                   v$locked_object vl,
                   dba_objects     do,
                   v$sqlarea       vsq
             where exists (select 1
                      from v$lock b
                     where a.ID1 = b.ID1
                       and a.ID2 = b.ID2
                       and a.SID <> b.SID)
               and vs.SQL_ADDRESS = vsq.ADDRESS(+)
               and a.SID = vs.SID
               and a.SID = vl.SESSION_ID
               and vl.OBJECT_ID = do.OBJECT_ID
               and a.BLOCK = 1
               and vs.LAST_CALL_ET > 600
             order by SID) mkb
     where mkb.sid is not null;
  commit;
end moni_lock;