“enq: TM - contention”锁引起数据库卡死

基本要素

         用户告知数据库迁移后,在发送医嘱的时候,有锁表情况,导致全院业务受影响,希望分析并解决。

问题分析

         查看ASH报告,如下:

CPUs           SGA Size       Buffer Cache        Shared Pool    ASH Buffer Size
---- ------------------ ------------------------------------ ------------------
 120   101,943M (100%)    81,920M(80.4%)      9,216M (9.0%)      240.0M (0.2%)
 
 
         Analysis Begin Time:  07-4月 -1508:39:41
           Analysis End Time:  07-4月 -1509:09:41
                 Elapsed Time:        30.0 (mins)
           Begin Data Source:  V$ACTIVE_SESSION_HISTORY
              End Data Source:   V$ACTIVE_SESSION_HISTORY
                 Sample Count:     184,994
     Average Active Sessions:     102.77
 Avg. Active Session per CPU:       0.86
                Report Target:   None specified
 
Top User Events                DB/Inst: ZLHIS/zlhis3  (4月  07 08:39 to 09:09)
 
                                                              Avg Active
Event                               Event Class        % Event   Sessions
-------------------------------------------------- ---------- ----------
enq: TM - contention                Application          93.47      96.07
CPU + Wait for CPU                  CPU                   3.18       3.27
enq: TX - row lock contention       Application           2.81       2.88
         -------------------------------------------------------------      


         可以看到,系统出现了严重的TM锁,TM锁是表级锁,如果出现,会引起严重的性能问题,接着需要分析下是什么对象导致,如下:

Top Event P1/P2/P3 Values      DB/Inst: ZLHIS/zlhis3  (4月  07 08:39 to 09:09)
 
Event                          % Event  P1 Value, P2 Value, P3 Value % Activity
------------------------------ ------------------------------------ ----------
Parameter 1                Parameter 2                Parameter 3              
---------------------------------------------------- --------------------------
enq: TM - contention             93.47     "1414332419","91048","0"      38.44
name|mode                  object #                   table/partition          
 
                                           "1414332419","90822","0"      34.22
                                                                                
 
                                          "1414332419","128417","0"      13.86
                                                                               
 
enq: TX - row lock contention     2.81 "1415053318","11206682","20"       0.30
name|mode                  usn16 | slot             sequence                 


         这里我们可以获取很重要的信息,object_id,,如上,我们可以看到被锁的对象id分别是91048,90822,128417,我们通过dba_objects这张视图,去查找ID号分别位上面3个的对象,分别是3张表”病例XX明细”、”药品XX明细”、”检验XX记录”,这3张表都没有数据,但是有个共同的特别,对药品和医嘱2张表都有外键相连,但是该表外键上都没有单独索引。一般情况下如果主键列被更新,就会导致外键列被锁住,不加索引的外键列会造成严重的性能问题,所以除非你有十分的把握,否则还是在外键列上添加索引。

解决过程

         分别对以上3张表的外键添加单独的索引,注意,这里如果有包含外键列的复合索引,也要单独再建个索引。

你可能感兴趣的:(“enq: TM - contention”锁引起数据库卡死)