设为首页 收藏本站
查看: 312|回复: 0

[经验分享] Oracle 阻塞(blocking blocked)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-9 09:24:09 | 显示全部楼层 |阅读模式
  阻塞是DBA经常碰到的情形,尤其是不良的应用程序设计的阻塞将导致性能严重下降直至数据库崩溃。对DBA而言,有必要知道如何定位到当前系统有哪些阻塞,到底谁是阻塞者,谁是被阻塞者。本文对此给出了描述并做了相关演示。



1、阻塞及其类型
a、什么是阻塞
   一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking)。也就是说新的会话会被挂起,直到持有锁的会话放弃锁定的资源。大多数情况下,在一个交互式应用中被严重阻塞,即可表明应用逻辑有问题,这才是阻塞的根源。
b、阻塞得类型
   数据库中有5条常见的DML语句可能会阻塞,即:INSERT、UPDATE、DELETE、MERGE 和SELECT FOR UPDATE。



2、几种不同类型阻塞的处理办法
a、INSERT阻塞主要是由于有一个带主键的表,或者表上有惟一的约束,在两个会话试图用同样的值插入一行时引发阻塞。多表通过引用完整性约束相互链接时,在其依赖的父表正在创建或删除期间,对子表的插入可能会阻塞。对于该类情形建议使用序列来生成主键/惟一列值。
b、对于UPDATE、DELETE、MERGE 和SELECT FOR UPDATE阻塞,只要有任一session使用这些操作已经锁定行,其余的必须处于等待状态。直到当前锁定行上的锁(排他锁)释放。对于该类情形,建议尽可能快速提交事务,或采用批量SQL方式提交。
c、对于一个阻塞的SELECT FOR UPDATE,解决方案很简单:只需增加NOWAIT 子句,它就不会阻塞了。



3、演示阻塞


    --更新表,注,提示符scott@CNMMBO表明用户为scott的session,用户名不同,session不同。  
    scott@CNMMBO> update emp set sal=sal*1.1 where empno=7788;  
      
    1 row updated.  
      
    scott@CNMMBO> @my_env  
      
    SPID                SID    SERIAL# USERNAME        PROGRAM  
    ------------ ---------- ---------- --------------- ------------------------------------------------  
    11205              1073       4642 robin           oracle@SZDB (TNS V1-V3)  
      
    --另起两个session更新同样的行,这两个session都会处于等待,直到第一个session提交或回滚  
    leshami@CNMMBO> update scott.emp set sal=sal+100 where empno=7788;  
      
    goex_admin@CNMMBO> update scott.emp set sal=sal-50 where empno=7788;  
      
    --下面在第一个session 查询阻塞情况  
    scott@CNMMBO> @blocker   
      
    BLOCK_MSG                                               BLOCK  
    -------------------------------------------------- ----------  
    pts/5 ('1073,4642') is blocking 1067,10438                  1  
    pts/5 ('1073,4642') is blocking 1065,4464                   1  
    --上面的结果表明session 1073,4642 阻塞了后面的2个  
    --即session 1073,4642是阻塞者,后面2个session是被阻塞者  
      
    --Author : Leshami  
    --Blog   : http://blog.iyunv.com/leshami  
      
    --下面查询正在阻塞的session id,SQL语句以及被阻塞的时间  
    scott@CNMMBO> @blocking_session_detail.sql  
      
    'SID='||A.SID||'WAITCLASS='||A.WAIT_CLASS||'TIME='||A.SECONDS_IN_WAIT||CHR(10)||'QUERY='||B.SQL_TEXT  
    -------------------------------------------------------------------------------------------------------  
    sid=1067 Wait Class=Application Time=5995  
     Query=update scott.emp set sal=sal+100 where empno=7788  
      
    sid=1065 Wait Class=Application Time=225  
     Query=update scott.emp set sal=sal-50 where empno=7788  
      
    --下面的查询阻塞时锁的持有情况   
    scott@CNMMBO> @request_lock_type  
      
    USERNAME                              SID TY LMODE       REQUEST            ID1        ID2  
    ------------------------------ ---------- -- ----------- ----------- ---------- ----------  
    SCOTT                                1073 TX Exclusive   None            524319      27412  
    LESHAMI                              1067 TX None        Exclusive       524319      27412  
    GOEX_ADMIN                           1065 TX None        Exclusive       524319      27412  
    --可以看到LESHAMI,GOEX_ADMIN 2个用户都在请求524319/27412上的Exclusive锁,而此时已经被SCOTT加了Exclusive锁  
      
    --查询阻塞时锁的持有详细信息  
    scott@CNMMBO> @request_lock_detail  
      
           SID USERNAME             OSUSER          TERMINAL                  OBJECT_NAME          TY Lock Mode   Req_Mode  
    ---------- -------------------- --------------- ------------------------- -------------------- -- ----------- --------------------  
          1065 GOEX_ADMIN           robin           pts/1                     EMP                  TM Row Excl  
          1065 GOEX_ADMIN           robin           pts/1                     Trans-524319         TX --Waiting-- Exclusive  
          1067 LESHAMI              robin           pts/0                     EMP                  TM Row Excl  
          1067 LESHAMI              robin           pts/0                     Trans-524319         TX --Waiting-- Exclusive  
          1073 SCOTT                robin           pts/5                     EMP                  TM Row Excl  
          1073 SCOTT                robin           pts/5                     Trans-524319         TX Exclusive   
文中涉及到的相关脚本下载:
http://pan.baidu.com/s/1sjPlqqD


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-21846-1-1.html 上篇帖子: oracle下session的查询与删除 下篇帖子: FORALL 之 SAVE EXCEPTIONS 子句应用一例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表