create or replace procedure solve_lock_061203(v_msg out varchar2)

 as

  v_sql varchar2(3000); --定义 v_sql 接受抓取锁的sql语句

  kill_sid    number;
  kill_serial number;

  cur_lock   sys_refcursor; --定义游标变量,循环执行抓取锁的sql语句
  cur_lock02 sys_refcursor;

  type tp_lock is record( --定义 record类型的 变量
    v_sid       number,
    v_type      varchar2(10),
    v_id1       number,
    v_id2       number,
    v_lmode     varchar2(200),
    v_request   varchar2(200),
    v_lock_time number,
    v_block     number);
  records_lock tp_lock;

  type tp_lock02 is record(
    waiting_sid   number,
    waiting_sql   varchar2(1000),
    blocker_event varchar2(1000),
    blocking_sid  number,
    blocking_sql  varchar2(1000));
  records_lock02 tp_lock02;

  v_blocking_sid number;
  v_waiting_sid  number;

begin
  v_msg := '';
  v_sql := '';

  v_msg := v_msg ||
           '------------------查找数据库中是否有锁阻塞、锁等待的情况------------------' ||
           chr(10);
  --  DBMS_OUTPUT.PUT_LINE('------------------查找数据库中是否有锁阻塞、锁等待的情况------------------');
  v_sql := 'select sid,type,id1,id2,
decode(lmode,0, ''none'',1,''null'', 2, ''row share'' ,3, ''row exclusive'' ,4, ''share'' ,5, ''share row exclusive'' ,6 ,''exclusive'' ,''null'') lock_type,
decode(request,0, ''none'',1,''null'', 2, ''row share'' ,3, ''row exclusive'' ,4, ''share'' ,5, ''share row exclusive'' ,6 ,''exclusive'' ,''hull'') lock_request,
ctime,block from v$lock where type in (''TM'',''TX'')';

  open cur_lock for v_sql;
  loop
    fetch cur_lock
      into records_lock;
    exit when cur_lock%notfound;
 
    if records_lock.v_request <> 'none' then
      --抓取发出请求锁的会话
    
      v_msg := v_msg || 'waiting sid: ' || records_lock.v_sid ||
               ' is request a lock ,lock_mode is ' ||
               records_lock.v_request || ' and being locked ' ||
               records_lock.v_lock_time || 's' || chr(10);
      --dbms_output.put_line('waiting sid: '||records_lock.v_sid||' is request a lock ,lock_mode is '||records_lock.v_request||' and being locked '|| records_lock.v_lock_time||'s');
      v_waiting_sid := records_lock.v_sid;
    end if;
 
    if records_lock.v_block <> 0 then
      --抓取发生锁阻塞的会话
      v_msg := v_msg || 'blocking sid: ' || records_lock.v_sid ||
               ' is make a lock , lock_mode is ' || records_lock.v_lmode ||
               chr(10);
    
      /* dbms_output.put_line('blocking sid: ' || records_lock.v_sid ||
      ' is make a lock , lock_mode is ' ||
      records_lock.v_lmode);*/
      v_blocking_sid := records_lock.v_sid;
    end if;
 
  end loop;
  close cur_lock;
  v_sql := '';

  v_msg := v_msg ||
           '------------------查找产生锁的会话、锁等待的会话------------------------' ||
           chr(10);
  --  dbms_output.put_line('------------------查找产生锁的会话、锁等待的会话------------------------');
  v_sql := 'select distinct waiter.sid "waiting_sid",w_sql.sql_text "sql from waiting session",blocker.event "blocker event",blocker.sid "blocking sid",
b_sql.sql_text "sql from blocking session"  from v$session waiter, v$session blocker,v$sql w_sql,v$sql b_sql
where waiter.event=''enq: TX - row lock contention'' and waiter.blocking_session=blocker.sid
and w_sql.sql_id=waiter.sql_id
and b_sql.sql_id =nvl(blocker.sql_id,blocker.prev_sql_id)';

  open cur_lock02 for v_sql;
  loop
    fetch cur_lock02
      into records_lock02;
    exit when cur_lock02%notfound;
 
    if records_lock02.waiting_sid is not null then
      v_msg := v_msg || 'waiting sid: ' || records_lock02.waiting_sid ||
               ' wait_sql is : ' || records_lock02.waiting_sql || chr(10);
      /* dbms_output.put_line('waiting sid: ' || records_lock02.waiting_sid ||
      ' wait_sql is : ' || records_lock02.waiting_sql);*/
    end if;
 
    if records_lock02.blocking_sid is not null then
      v_msg := v_msg || 'blocking sid: ' || records_lock02.blocking_sid ||
               ' block_sql is : ' || records_lock02.blocking_sql || chr(10);
      /* dbms_output.put_line('blocking sid: ' || records_lock02.blocking_sid ||
      ' block_sql is : ' ||
      records_lock02.blocking_sql);*/
    end if;
  end loop;
  close cur_lock02;

  v_msg := v_msg || '------------------解决 锁阻塞、锁等待------------------' ||
           chr(10);
  --  dbms_output.put_line('------------------解决 锁阻塞、锁等待------------------');

  select sid, serial#
    into kill_sid, kill_serial
    from v$session
   where sid = v_blocking_sid;
  v_msg := v_msg || 'action: alter system kill session ( ' || kill_sid || ',' ||
           kill_serial || ')' || chr(10);
  /*  dbms_output.put_line('action: alter system kill session ( ' || kill_sid || ',' ||
  kill_serial || ')');*/

exception
  when no_data_found then
    v_msg := v_msg || sqlerrm;
    /* dbms_output.put_line(sqlcode || sqlerrm);*/

end solve_lock_061203;

solve_lock-1024-大功告成的更多相关文章

  1. python3爬取1024图片

    这两年python特别火,火到博客园现在也是隔三差五的出现一些python的文章.各种开源软件.各种爬虫算法纷纷开路,作为互联网行业的IT狗自然看的我也是心痒痒,于是趁着这个雾霾横行的周末瞅了两眼,作 ...

  2. mysql Packet for query is too large (1185 > 1024)异常

    注:最近mysql一直提示如下错误 Packet for query is too large (1185 > 1024). You can change this value on the s ...

  3. 2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一

    往期回顾:  老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会 ...

  4. BZOJ 1024: [SCOI2009]生日快乐

    Description 将一个 \(x\times y\) 的矩形分成 \(n\) 块,让最长边:最短边 最小. Sol 搜索. \(n\) 只有 \(10\) 写一个类似于记搜的东西就好了. Cod ...

  5. HDU 1024 max sum plus

    A - Max Sum Plus Plus Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  6. RCA:未注意Curl-library Post 1024以上字节时的HTTP/1.1特性导致 HessianPHP 传输数据失败

    先列出 HessianPHP 的错误提示: CURL transport error: transfer closed with outstanding read data remaining 基础知 ...

  7. 使用TarOutputStream出现 request to write '1024' bytes exceeds size in header错误的解决方法

    因为测试流程中,所测客户端会根据服务器A返回的response决定发送给服务器B的请求里各参数的值,所以现在需要模拟服务器的响应.而这个项目服务器A的响应式返回一个流,一个GZIP压缩格式流,压缩的是 ...

  8. nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1044 > 1024

    HTTP Status 500 - type Exception report message description The server encountered an internal error ...

  9. ecshop 加广告出现广告位的宽度值必须在1到1024之间

    打开 admin/ad_position.php这个文件,搜索1024,这里你会搜到两个地方 在236行左右 if ($ad_width > 1024 || $ad_width < 1) ...

  10. mysql root强密码的必要性max_allowed_packet被改成1024引起的风险

    前两天运维反馈说,有些机器的max_allowed_packet隔两天就会被改成1024,导致客户端调用时出错,网上有说内存不够的,也有人工修改的. 运维小姑娘一口咬定肯定没有改过的,而且my.cnf ...

随机推荐

  1. ssh+c3p0调用存储过程、组拼STRUCT时仅使用一个connection的方法 c3p0代理类转原始类(connection)

    正常情况,我们会调用存储过程用hibernate提供的连接池代理连接类来调用存储过程,而用新建连接给存储过程组拼STRUCT. 但是这样感觉可以再一步的优化:调用存储过程与构建STRUCT用hiber ...

  2. BZOJ1599: [Usaco2008 Oct]笨重的石子

    1599: [Usaco2008 Oct]笨重的石子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 758  Solved: 513[Submit][ ...

  3. myeclipse如何修改Web项目名称

    1. 使用myeclipse进行Web项目开发时,有时候项目名称重命名了,但是WEB项目在tomcat里边的名称还是原来的名称,是需要重新命名的.下边详细介绍一下如果和修改web项目名称,myecli ...

  4. nyoj 710 外星人的供给站【贪心区间选点】

    外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命 ...

  5. hdu 2066 一个人的旅行(最短路问题)

    最短路································· 类似的问题还有好多不会!慢慢学吧!!!!. 进步,哪怕每天一点也行! (恋爱不是小事,确实小事的积累!(听着酷狗音乐台说的,很 ...

  6. 将solr3.5整合到Tomcat6.x中

    最近在学习Lucene,然后进入到solr中,没想到一开始,solr就给我来了这么困难的开头,希望万事开头难,以后可以顺利一点吧.记录下将solr3.5整合到Tomcat6.x中的过程,以及遇到的一个 ...

  7. oracle DG 主备切换语句整理

    今日花了一下午时间进行了Oracle DataGuard的切换练习,参考了网上好多文章,最后将一些语句进行摘录,以备以后查询使用.之后有时间会带来Oracle DG的搭建和切换全过程文章. DataG ...

  8. C# 获取网页数据、获取本机IP 分类: C# 2014-12-16 14:59 308人阅读 评论(0) 收藏

    说明: (1) http://www.3322.org/dyndns/getip 这个网址可以获取本机IP,读取的内容就是本机IP (2)方法经测试,可以实现. (3)参考:http://www.cn ...

  9. SwipeListView 具体解释 实现微信,QQ等滑动删除效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28508769 今天看别人项目,看到别人使用了SwipeListView,Goog ...

  10. 《Linux Device Drivers》第十章 中断处理——note

    概述:系统要及时的感知硬件的状态,通常有两种方式:一种是轮询.一种是通过响应硬件中断.前者会浪费处理器的时间,而后者不会. 准备并口 在没有节设定产生中断之前,并口是不会产生中断的 并口的标准规定设置 ...