资源供给:并发性控制和锁之四


     简单案例描述:
          某运营商的CRM系统,突然出现大量latch: undo global data冲突,主要的查询语句都大规模的进行关于undo global data的冲突。在consistent read的时候需要获得undo global data latch去查看对应的undo segment Header和Undo block信息,而这个时候undo segment header和undo block均被处于锁定状态,所以需要等待。原因非常简单,系统中有一个大型操作由于无法及时完成被人工中断,正在进行大型回滚。在回滚的过程中,需要不断的修改undo segment header和undo segment Block,导致频繁的undo global data等待。在rollback操作完成之后,latch: undo global data冲突自然消失。

     空间事务管理,是Oracle数据库最为重要的内部操作之一,在空间事务管理中涉及到各种空间管理锁。
     我们讲空间管理,主要讲一下几部分:
     (1)、New Extent
     (2)、HWM Movement
     (3)、Space Shrink
     (4)、Free Block Pool management
      

    对于以上的空间管理,我们又可以分为以下几个方面:
    (1)、普通数据和索引表空间、Segment
    (2)、Undo Tablespace和Undo Segment
    (3)、Temporary tablespace and Temporary Segment

    New Extent: 主要涉及表空间位图变化和Segment Header Extent Map变化。
          在普通的数据和索引表空间中,New Extent应该涉及ST Lock and Buffer lock
          在Undo Tablespace中,New Extent应该涉及到ST Lock,US Lock and Buffer Lock
          在Temporary Tablespace中,New Extent应该涉及ST Lock,TS Lock和TT Lock and Buffer Lock

   HWM Movement:主要涉及HWM值的变化和Segment Free Block Pool的变化。
           在普通数据和索引表空间,HWM Movement应该涉及HW Lock和Buffer Lock
    Space Shrink: Space Shrink是New Extent的反向运动,应该和New Extent拥有同样的Lock。
    Free Block Pool Management:
          Segment Block Pool Management是空间事务管理的最基本操作,完成段的自由空间管理,和HWM,New Extent,Extent Shrink紧密相关,主要考虑在HWM之下的空闲空间管理。
          Allocate Free Block:分配空闲空间使用,当insert操作(部分update操作)发起的时候需要通过查找Free Block Pool获得空闲的数据块。这个操作很有可能没有队列锁的参与,而完全由buffer Lock完成操作。显然这里不会有HW,ST等锁,查找Oracle的队列锁,也没有发现似乎对应的队列锁名字。吕海波先生的简单测试在Undo Segment进行New Block的时候也没有发现队列锁的使用,我们这里暂时认定在空闲空间管理的没有涉及到队列锁,而是使用了更加高效的buffer lock。
          Free Block to Free Block Pool: 释放数据块到空闲块列表可以被下次使用。在delete操作之后,空间事务管理检查是否可以达到空闲数据块的标准,使之加入空闲数据块列表。在ASSM之前采用PCT USED来进行管理,在ASSM中,采用不同的空闲数据块桶来进行管理,Full EMPTY,25% EMPTY,50% EMPTY,75% EMPTY,0% EMPTY。在这个过程同样应该没有锁的参与,而仅仅是buffer lock的参与。吕海波先生有一篇精彩的文章讲述这个议题,大家可以参考。
       
         大家来看常见的涉及到空间事务管理的场景:
         (1)、批量的加载数据
         (2)、批量的删除数据
         (3)、大型事务的rollback
         (4)、Undo Segment Expired| Steal
         (5)、Large Sort Segment Extent
         (6)、Large Undo Segment Extent
         (7)、Drop or Truncate Large Segment

        Drop or Truncate large segment:
        除了涉及到上面的锁之外,还需要进行针对对象的checkpoint操作,当大型表格的大部分Block被buffer cache锁缓存的时候,Drop或者truncate操作可能会带来巨大的checkpoint成本,需要把这些被占用的buffer block进行清空,变成empty,这个时候似乎需要用到RO锁。

        在批量加载的时候,有时候空间管理的成本会达到总成本的1/3以上,如何最大程度的降低空间事务成本对于业务性能加速具有很大的影响。
       (1)、对于批量加载的处理
        Large Extent and preallocate Extent
        Add HW Move Block,缺省是5个Block,对于批处理加载这个数值是远远不够的,会导致其不断的获取HW Lock,不断的修改Free Block Pool。
        另外一个Extent只能在一个数据文件内,相信多数据文件多余降低冲突会有所帮助。

       (2)、保持充足的回滚表空间和相对较小规模的事务
        Undo Segment的空间事务过程:
       (1)、Get Free Block
       (2)、Get New Block
       (3)、Get Expried Block
       (4)、get Steal Block
      (5)、Get New Extent
      从成本来说,基本上以上操作是由低到高。
      相对较小规模的事务可以使undo segment总是存在足够的free block使事务可用。
      另外retention autotune也会对于回滚段造成一定的压力,不断的计算和更新retention table,导致undo segment header会频繁的被 buffer lock,甚至可能会执行us lock。

     (3)、Oracle RAC和Temporary Segment
           保持合适Temporary Segment Extent,一个Extent只能被一个排序锁拥有,过大的Extent可能会导致空间的巨大浪费。
           保持足够多的临时文件,降低SS(ST) lock的冲突
           在RAC环境下保持适当的空闲空间,甚至进行空闲空间的人工维护以避免向另一个节点借用Extent进行排序。

    (4)、保持合适的事务规模,避免事务失败造成巨大影响
     大型事务的失败会引起大量空间事务和长时间的锁定,会严重的影响业务并发性。
 

    
    

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/92650/viewspace-1061801/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/92650/viewspace-1061801/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值