【故障处理】队列等待之enq: US - contention案例,转载_执笔画情ora的博客-程序员宅基地

技术标签: ORACLE数据库等待事件分析  

声明:文章转载于http://itfish.net/article/65243.html#

 

【故障处理】队列等待之enq: US - contention案例

1  BLOG文档结构图

wps6E72.tmp 

 

 

2  前言部分

2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① enq: US - contention等待事件的解决

② 一般等待事件的解决办法

③ 队列等待的基本知识

  Tips:

① 本文在ITpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新

② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/)

③ 若文章代码格式有错乱,推荐使用搜狗、360或QQ浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/,另外itpub格式显示有问题,可以去博客园地址阅读

④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。

  List of Archived Logs in backup set 11

  Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

  ---- ------- ---------- ------------------- ---------- ---------

  1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

  1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

  2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

  2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

 

[ZHLHRDB1:root]:/>lsvg -o

T_XDESK_APP1_vg

rootvg

[ZHLHRDB1:root]:/>

00:27:22 SQL> alter tablespace idxtbs read write;

 

====》2097152*512/1024/1024/1024=1G 

 

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

 

 

3  故障分析及解决过程

 

3.1  故障环境介绍

 

项目

source db

db 类型

RAC

db version

11.2.0.4.0

db 存储

ASM

OS版本及kernel版本

AIX 64位 7.1.0.0

 

3.2  故障发生现象及报错信息

最近系统做压测,碰到的问题比较多,今天同事发了个AWR报告,说是系统响应很慢,我简单看了下,简单分析下吧:

wps6E83.tmp 

270分钟时间而DB Time为2000多分钟,DB Time太高了,负载很大,很可能有异常的等待事件,系统配置还是比较牛逼的。

wps6E84.tmp 

事务量很大,其它个别参数有点问题,不一一解说了。等待事件很明显了:

wps6E85.tmp 

AWR的其它部分就不分析了,首先这个等待事件:enq: US - contention比较少见,查了一下资料,有点收获:

SELECT * FROM V$EVENT_NAME WHERE NAME = 'enq: US - contention';

wps6E86.tmp 

 SELECT * FROM v$lock_type d WHERE d.TYPE='US';

wps6E87.tmp 

"enq: US - contention",这个event说明事务在队列中等待UNDO Segment,通常是由于UNDO空间不足导致的。

在对此事件说明之前,需要理解在使用AUM(atuomatic undo management)时,回滚段在何时联机或脱机。AUM与RBU(rollback segment management)不同,回滚段的管理是Oracle自动完成的。使用AUM时,回滚段的联机或脱机的时刻如下:

1)在执行alter database open的时候将回滚段联机

2)通过alter system set undo_tablespace=xxx 修改撤销表空间时,将原来的回滚段脱机后,再将新的回滚段联机。

3)通过SMON,自动脱机或者联机回滚段,如果一段时间内,事务量增加,联机状态的回滚段也会增加,一段时间内若是没有实物或事务减少,回滚段就会被smon进程脱机。

为了同步将回滚段联机或脱机的过程,执行该工作的服务器进程或后台进程应获得US锁,每个回滚段非配一个US锁,ID1=Undo segment#。若在获得US锁的过程中发生争用,则等待enq:US-contention事件。服务器进程应该在开始事务时分配到回滚段,但如果不存在可用的回滚段时,应该创建新的回滚段或将脱机状态的回滚段联机。在实现此项工作期间,服务器进程为了获得US锁而等待,等待占有可用回滚段。

这是oracle10g中开始出现的bug(在11.1.0.7中仍有这个BUG),当因为系统activity增加或者降低的时候,oracle SMON进程会自动ONLINE或者OFFLINE rollback segments。这样导致某些与undo segments相关的latch或者enqueue被hold住太长时间,导致系统很多活跃session都开始等待enq: US - contention。可以同时使用以下解决方法:

1. 设置event让SMON不自动OFFLINE回滚段

alter system set events '10511 trace name context forever, level 1';

 

2. 设置参数_rollback_segment_count :表示有多少rollback segment要处于online的状态;可以将该数值设置为数据库最繁忙的时候的回滚段数目。

alter system set "_rollback_segment_count"=1000 SID='*';

这里以"_"开头的为隐藏参数,通过show parameter 是看不到的,可以通过以下语句:

select a.ksppinm name, b.ksppstvl value, a.ksppdesc description

from xksppia,xksppia,xksppcv b

where a.indx = b.indx

and a.ksppinm like '%_rollback_segment_count%';

 

3.  undo autotune bug多多。最好disable。

alter system set "_undo_autotune"= false;

这种方法就是关闭了UNDO的自动调整功能,同时也能解决掉UNDO表空间会在很长时间都一直保持着使用率是接近100%的问题。

 

4.  有一个patch: A fix to bug 7291739 is to set a new hidden parameter, _highthreshold_undoretention to set a high threshold for undo retention completely distinct from maxquerylen.

alter system set "_highthreshold_undoretention"=;

 

5. 增加undo表空间

alter tablespace UNDOTBS1 add datafile '+DATA1' size 30G;

 

6. 设置undo表空间的NOGUARANTEE

select tablespace_name, retention from dba_tablespaces where tablespace_name like 'UNDO%';

ALTER TABLESPACE UNDOTBS RETENTION NOGUARANTEE;

 

7. 减少UNDO_RETENTION的时间

SQL> show parameter undo

NAME                                  TYPE         VALUE

------------------ ---------------------- --------

undo_management                     string        AUTO

undo_retention                      integer       10800

 

8. 重启数据库节点

 

3.3  故障分析及解决

我们查询ASH视图看看当时的情况:

 SELECT D.SQL_ID,CHR(BITAND(P1, -16777216) / 16777215) ||

        CHR(BITAND(P1, 16711680) / 65535) "Lock",

        BITAND(P1, 65535) "Mode", COUNT(1),COUNT(DISTINCT d.session_id )

  FROM DBA_HIST_ACTIVE_SESS_HISTORY D

 WHERE D.SAMPLE_TIME BETWEEN TO_DATE('2016-09-07 17:39:44', 'YYYY-MM-DD HH24:MI:SS') AND

       TO_DATE('2016-09-07 22:13:41', 'YYYY-MM-DD HH24:MI:SS')

   AND D.EVENT = 'enq: US - contention'

 GROUP BY D.SQL_ID,(CHR(BITAND(P1, -16777216) / 16777215) ||

        CHR(BITAND(P1, 16711680) / 65535)),(BITAND(P1, 65535));

wps6E98.tmp 

LOCK为US,MODE为6,看看具体的SQL内容:

 SELECT A.SQL_TEXT, A.EXECUTIONS, A.MODULE, A.SQL_ID

 FROM V$SQL A

WHERE A.SQL_ID IN ('5ww8x9u15a90y',

 'ayngk81z8fh0m',

 '1cmnjddakrqbv',

 '26ad9zvt5xgb3');

wps6E99.tmp 

看看时间段是哪个区间:

SELECT D.SQL_ID, TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI'), COUNT(1)

  FROM DBA_HIST_ACTIVE_SESS_HISTORY D

 WHERE D.EVENT = 'enq: US - contention'

   AND D.SQL_ID IN ('5ww8x9u15a90y', '26ad9zvt5xgb3')

 GROUP BY D.SQL_ID, TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI');

wps6E9A.tmp 

看来问题几种在这2分钟之内。基本都是对同一个表做插入或者更新操作:

 SELECT DISTINCT D.CURRENT_OBJ#

   FROM DBA_HIST_ACTIVE_SESS_HISTORY D

  WHERE D.SAMPLE_TIME BETWEEN

        TO_DATE('2016-09-07 17:39:44', 'YYYY-MM-DD HH24:MI:SS') AND

        TO_DATE('2016-09-07 22:13:41', 'YYYY-MM-DD HH24:MI:SS')

    AND D.EVENT = 'enq: US - contention'

  GROUP BY D.CURRENT_OBJ#;

SELECT * FROM DBA_OBJECTS a WHERE a.object_id IN  ('87620','87632','87663','87667','87686','87684','87688','87626','87646','87642','87639','87661','87628','87675','87643','87677','87660','87631','87629','87668','87682','87685','87654','87640','87627','87636','87664','87655','87645','87637','87669','87673','87666','87634','87644','87672','87648','87649','87662','87651','87641','87653','87659','87680','87681','0','87625','87670','87658','87674','87671','87633','87679','87647');

wps6E9B.tmp 

 

可以看到操作的表是一个分区表。

解决方案:

alter tablespace UNDOTBS1 add datafile '+DATA1' size 30G;

alter system set events '10511 trace name context forever,level 1';

ALTER SYSTEM SET "_rollback_segment_count"=1000 SID='*';

 

执行之后经过开发进行压测,已经没有该等待事件的产生了:

SELECT D.SQL_ID, TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI'), COUNT(1)

  FROM DBA_HIST_ACTIVE_SESS_HISTORY D

 WHERE D.EVENT = 'enq: US - contention' 

 GROUP BY D.SQL_ID, TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI');

 

查询无数据。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/oradbm/article/details/84933228

智能推荐

调用api获取app_id_在api调用中使用相关ID_一二三是五六十的博客-程序员宅基地

调用api获取app_idWritten by Nico Di Rocco, Senior Software Engineer and Rolph Haspers, Engineering Manager @ Leaseweb 由Leaseweb高级软件工程师Nico Di Rocco和工程经理Rolph Haspers撰写 Over the years, the IT industry has...

开发Openfire聊天记录插件_openfire 审计 插件_MOKA的博客-程序员宅基地

m上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插件的开发,以及怎么样将开发好的插件打包、部署到openfire服务器。 如果你没有看上一篇文章的话,请你还是看看。http://www.cnblogs.com/h

2017.08.06【NOIP 普及组】模拟赛C组 题解_Jose何塞的博客-程序员宅基地

又是一年C组时......第一题,淼!水题!纯暴力!然而考虑太多,调了一个小时.....心生绝望.....变态!完了!第二题,思路容易想,用周期问题解,so easy!但代码写的肮脏不堪.....第三题,前缀和维护列行,water!终于打的顺畅一点了!第四题,没想太多,直接dfs!感觉要崩......But C组Rank1!人生第一次.....第三题脑残

golang uber log插件支持写到文件_encoderconfig.levelkey_weixin_30746129的博客-程序员宅基地

uber zap log组建,利用lumberjack插件写到文件package logimport ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" "os" "sync" "time")var Logger *zap.Loggerfunc Releas...

layui是什么_weixin_30784501的博客-程序员宅基地

layui是什么一、总结一句话总结:初步看起来比amazeui好看一点点。移动端显示看起来效果真心不错。还有即时聊天那个组件下载,感觉真心不错,可以多去看看。二、Layui1、简介经典模块化前端框架ui框架,前端框架,JS组件Layui 是一款采用自身模块规范编写的情怀型前端UI框架,遵循原生HTML/CSS/JS的书写与组织形式,门槛...

无良老板拖欠程序员工资,一怒开源冲上 GitHub TOP1_CSDN资讯的博客-程序员宅基地

作者 | 沭七出品 | CSDN(ID:CSDNnews)GitHub Trending 一直都是程序员关注 GitHub 最新技术潮流最热开源项目的地方,今天它的 TOP1 项目着实让人有点儿心疼,来自以色列的全栈及区块链开发者 Jason Werner 花了好几周的时间为客户开发了一个项目,但是却惨遭毁约没有得到相应的报酬,Jason 在 Twitter 及 GitHub RE...

随便推点

java项目旅行网_基于jsp的旅行社网站系统-JavaEE实现旅行社网站系统 - java项目源码..._超G运营商数字化创客的博客-程序员宅基地

基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的旅行社网站系统, 该项目可用各类java课程设计大作业中, 旅行社网站系统的系统架构分为前后台两部分, 最终实现在线上进行旅行社网站系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类旅行社网站系统相关的实体进行管理。该旅行社网站系统为一个采用mvc设计模式进行开发B/S架构项目,并采用...

BZOJ 2959: 长跑(LCT+并查集)_AbEver的博客-程序员宅基地

题目传送门题目大意就是三个操作: ①将点A,B连一条无向边 ②改变点A的权值 ③问你从A到B的路径的权值和,其中边可以重复一个方向走,点可以重复走但权值只算一次。题解如果没有①②且给出的是树的话,就是一个求LCA。 如果没有①操作而是给出一个静态的树的话,那么就是一个树链剖分了。 如果保证是树(森林)的话,那就直接做一个LCT就行了。关键就是它是一个图。 显然,如果A,B在一个环中的话,

自学python在电脑上安装什么杀毒软件好_Python自动安装Rising杀毒软件_weixin_39822673的博客-程序员宅基地

不能使用时,或重新安装系统时,方便我们重新安装最新的版本.但是每次安装都要点击好几次 Next 按钮,同时还要提供序列号,ID 等信息,我很讨厌这种重复工作,索性写一个小的脚本,让他自动安装,这样我就可以,在安装时休息几分钟了脚本使用了 Python 2.3 + Com 对象,所以你的系统必须安装Python2.3或更高版本同时必须安装 Mark Hammond's Win32all 模块(特别感...

php设置html全局路径_phpcms v9 html生成路径修改教程_weixin_39546520的博客-程序员宅基地

打开caches\configs\system.php,修改html_root的值默认在51行:'html_root' => '/html',//生成静态文件路径修改为:'html_root' => '',//生成静态文件路径将html_root这项值添加到后台的基本设置中,让管理员可以随时修改html_root的这个值1.打开phpcms\modules\admin\function...

计算机专业毕业典礼,计算机科学系举行2018届毕业典礼_weixin_39680609的博客-程序员宅基地

2018年6月28日下午,计算机科学系在报告厅隆重举行2018届毕业典礼,欢送192名专科毕业生。系领导班子全体成员和毕业班班主任出席了本次毕业典礼,所有毕业生都正装出席。毕业典礼在全场高唱雄壮的国歌声中正式开始。英锋主任宣读毕业的决定并为毕业生代表颁发毕业证书,田敬军副主任宣读表彰决定,为思想积极上进、学习成绩优秀、专业素质过硬的先进个人颁发奖状。国家奖学金、省级优秀毕业生获得者高洪瑞,省级优秀...

STM32F0x HAL库学习笔记(3)使用HAL库延时函数(HAL_Delay())_Yonas-Luo的博客-程序员宅基地

本文开发环境:MCU型号:STM32F051R8T6IDE环境: MDK 5.25代码生成工具:STM32CubeMx 5.0.1本文内容:systick 定时器简介使用HAL_Delay()延时函数实现LED灯闪烁Systick 定时器HAL_Delay()延时函数 while (1) { /* USER CODE END WHI...