Oracle 使用AWR处理问题

语言: CN / TW / HK

theme: cyanosis

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动
本文同时参与 「掘力星计划」  ,赢取创作大礼包,挑战创作激励金

怎样抓取管理awr,之前写过,就不过多介绍了。
https://juejin.cn/post/7002048974605680677
https://juejin.cn/post/7002421237586591751
本文主要结合实际环境谈下 Oracle 单机环境下如何利用awr报告,分析数据库问题。

一、背景

运维人员反映,上午系统卡住,页面无法加载使用,下午系统自动恢复正常,软件层面未排查到原因,请求协助排查数据库层面。

二、分析定位

2.1 确认时间范围

与运维人员确认了上午业务异常时间段为 9:30-11:30,下午业务正常时间段为 13:30以后。

2.2 抓取 awr 报告

数据库服务器上运行脚本 @?/rdbms/admin/awrrpt.sql,抓取两个时间段的awr报告,因awr快照默认生成频率为1小时,故抓取了正常时间段 10:00-11:00 和异常时间段 14:00-15:00 的awr报告。

2.3 查看 awr 报告

2.3.1 查看数据库压力

awr报告开头展示的内容。
Elapsed/DB Time 的值越小,数据库压力越大。
awr快照默认生成频率都是1小时,所以通常直接看 DB Time 即可,改值越大,数据库压力越大。
业务正常时数据库压力: image.png 业务异常时数据库压力: image.png 抓取了业务正常时间段和不正常时间段的数据库awr报告,上述业务异常时数据库的 DB Time 明显比正常时高出很多,可判断数据库目前存在问题。

业务越繁忙 DB Time 越高,但一般也不会超过 2000(mins)。

2.3.2 查看数据库等待事件

业务正常时等待事件: image.png 业务异常时等待事件: image.png 正常时,DB CPU 排在 top 的首位,异常时其他等待事假会跃居 top 首位。
上述直接查询异常时的等待事件 enq: HW - contention 即可。(Oracle 绝大多数等待事件的原因和处理方式网上都可查到)经查询可得到如下解释:

为防止多个进程同时修改HWM而提供的锁称为HW锁。想要移动HWM的进程必须获得HW锁。若在获取HW锁过程中发生争用,则等待enq: HW - contention事件。HW锁争用大部分是因大量执行insert所引发的,偶尔也会因大量执行update在回滚段中发生HW锁争用现象。若是update,表中段的扩展的大小虽然不多,但在创建回滚数据的过程中,需要回滚段的急速扩张。HW锁争用是在急速空间扩张时普遍出现的等待现象,有时也会引发严重的性能下降。

根据上述等待事件信息,可判断数据库内存在 sql 造成了锁争用。

2.3.3 查看数据库 sql 耗时

业务正常时 sql 耗时: image.png 业务异常时 sql 耗时: image.png Elapsed Time (s):sql 执行总耗时。
Executions:sql 执行次数。
Elapsed Time per Exec (s):sql 每次执行所消耗时间。
%Total:sql 耗时百分比。

直接看排名前几位的即可,正常时排在第一位的 sql 一小时内(抓取的快照时间)执行了 1,838 次,每次执行 0.94s,共耗费时间为 1,733.81s,正常速度。
异常时排在第一位的 sql 一小时内(抓取的快照时间)执行了 2,972 次,每次执行 108.43s,共耗费时间为 322,249.95s,明显不正常。 查看异常时间段耗时 sql 的百分比 96.42%,再结合上述等待事件,可判断改 sql 造成了数据库锁争用。

2.3.4 查看抓取数据库具体 sql 信息

直接单击对应的 sql_id 跳转到详细的 sql 页面。 image.png image.png

三、将抓取的 sql 交于系统研发人员

将抓取的 sql 交于系统研发人员,结合业务逻辑进行优化。