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. 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)

    云处理平台开发工程师 工作地:杭州 岗位职责:负责云处理平台研发工作: 岗位要求: 扎实的 C 语言编程基础及算法优化能力: 至少能够熟练使用一门脚本语言(Python.Ruby.Lua 等)进行日常 ...

  2. MyEclipse6.5安装SVN插件的三种方法z

    一.安装方法: 方法一.如果可以上网可在线安装   . 打开Myeclipse,在菜单栏中选择Help→Software Updates→Find and Install;   . 选择Search ...

  3. android和struts2实现android文件上传

    1.开发准备如下2个工具类 package org.lxh.util; import java.io.BufferedReader; import java.io.InputStreamReader; ...

  4. Java Random随机种子

    第一种情况 Random rand = new Random(47); for(int i=0;i<10;i++) System.out.println(rand.nextInt(100)); ...

  5. Linux Shell编程(24)——命令替换

    命令替换 将会重新分配一个命令[1]甚至是多个命令的输出; 它会将命令的输出如实地添加到另一个上下文中. [2]使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括 ...

  6. Unity之Avatar原理

    今天花了一些时间理了理Unity的动画系统. 之前给不同模型配动画时没怎么在意,只知道用Avatar可以让一个模型使用另一个模型的动画.由于用的基本上都是人物模型,基本上没出现什么错误. 不过在用到异 ...

  7. Delegate。。

    Delegate类简介------------------------ 命名空间:System程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一种数据结构,通 ...

  8. [Git] Github客户端上publish后一直转圈,web上未上传成功

    连续试了几次,publish后一直处于publish状态,点击其它repositories再点回来就没动静了,也看不到Sys按钮...最后发现,是要等很久才会成功,天朝的网络伤不起

  9. C++Primer第5版学习笔记(三)

    C++Primer第5版学习笔记(三) 第四/五章的重难点内容           你可以点击这里回顾第三章内容       因为第五章的内容比较少,因此和第四章的笔记内容合并.       第四章是 ...

  10. JavaEE中遗漏的10个最重要的安全控制

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! JavaEE有一些超赞的内置安全机制,但它们远远不能覆盖应用程序要面临的所有威胁.很多常见攻击,例如跨站点脚本攻 ...