通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
awr报告中的sql明细部分基本必看的部分,尤其是SQL Order by Elapsed time这个部分,能够很清晰的看到哪些sql语句占用了较多的DB time,所占的比例。这个可以作为调优时的一个重要参考,可以有针对性的来看哪些sql需要格外关注。 比如说我们得到了一个awr报告,Elapsed time这个部分的内容如下。可以很明显看出sql_id为dfb15m5s2uwmc的sql需要格外关注,因为它占用了近一半的DB time.
Elapsed Time (s) |
Executions |
per Exec (s) |
%Total |
SQL Id |
|||
---|---|---|---|---|---|---|---|
3,601.90 |
0 |
48.52 |
dfb15m5s2uwmc |
||||
1,612.04 |
21 |
76.76 |
21.71 |
8tmf11fvxy09j |
|||
1,593.80 |
20 |
79.69 |
21.47 |
cy55p6nrd31db |
|||
298.34 |
20 |
14.92 |
4.02 |
29tdwfv5d9s4f |
awr提供的功能集很完整,如果我们能够更快的定位出来哪些sql占用了较多的DB time而不用每次都去生成一个awr报告,其实也是可以实现的,我们可以定制。 在之前的博客中提到awr的导出 http://blog.itpub.net/23718752/viewspace-1123134/ 部分日志如下: . . exported "SYS"."WRH$_SQL_PLAN" 432.1 KB 1089 rows . . exported "SYS"."WRH$_LATCH":"WRH$_LATCH_3645037571_0" 198.6 KB 3871 rows . . exported "SYS"."WRH$_SYSMETRIC_HISTORY" 180.1 KB 3600 rows
可以看到awr的基表是wrh$开头的,这个和我们常用的数据字典表息息相关。
比如sqlstat,数据字典里的历史数据就把wrh$换位dba_hist即可。
我们查看dba_hist_sqlstat的基表,其实发现就是wrh$这样的基表。
$ ksh showdict.sh DBA_HIST_SQLSTAT
object_details
OWNER OBJECT_ID DATA_OBJECT_ID OBJECT_NAME OBJECT_TYPE
------------------------------ ---------- -------------- ------------------------------ -------------------
SYS 9409 DBA_HIST_SQLSTAT VIEW
PUBLIC 9410 DBA_HIST_SQLSTAT SYNONYM
synonym_details
OWNER SYNONYM_NAME
------------------------------ ------------------------------
PUBLIC DBA_HIST_SQLSTAT
view_details
VIEW_NAME TEXT
------------------------------ --------------------------------------------------------------------------------
DBA_HIST_SQLSTAT select sql.snap_id, sql.dbid, sql.instance_number,
xxxx from WRM$_SNAPSHOT sn, WRH$_SQLSTAT sql
where sn.snap_id = sql.snap_id
and sn.dbid = sql.dbid
and sn.instance_number = sql.instance_number
and sn.status = 0
那么我们就可以直接从这些数据字典历史表里去查看所需要的信息而不用每次都重新生成一个awr报告。
当然实现的过程也略微费了一些周折,把脚本稍一加工,就成了shell版本。
sqlplus -s $DB_CONN_STR@$SH_DB_SID <<EOF
break on db_name
set pages 50
set linesize 100
col elapsed_time format a10
col per_total format a10
prompt
prompt Current Instance
prompt ~~~~~~~~~~~~~~~~
select d.dbid dbid
, d.name db_name
, i.instance_number inst_num
, i.instance_name inst_name
from v$database d,
v$instance i;
select snap_id,sql_id,EXECUTIONS_DELTA,max_elapsed elapsed_time,per_total||'%' per_total from
(select distinct snap_id,sql_id,EXECUTIONS_DELTA,trunc(max(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id,sql_id )/1000000,0)||'s' max_elapsed,
trunc((max(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id,sql_id))/(SUM(ELAPSED_TIME_DELTA) OVER (PARTITION BY snap_id )),2)*100 per_total
from dba_hist_sqlstat where snap_id=$1
order by 5 desc
) where rownum<=5;
输出的内容结果如下,和html的格式比起来,也还是很清晰的,只需要输入结束的快照号即可。
$ ksh showsnapsql.sh 57584
Current Instance
~~~~~~~~~~~~~~~~
DBID DB_NAME INST_NUM INST_NAME
---------- --------- ---------- ----------------
2534640677 TESTDB2 1 xxxxx
SNAP_ID SQL_ID EXECUTIONS_DELTA ELAPSED_TI PER_TOTAL
---------- ------------- ---------------- ---------- ----------
57494 dfb15m5s2uwmc 0 3601s 48%
57494 8tmf11fvxy09j 21 1612s 21%
57494 cy55p6nrd31db 20 1593s 21%
57494 29tdwfv5d9s4f 20 298s 4%
57494 c7k4g2urpu1sc 0 175s 2%
这个时候就可以轻松抓取到问题sql,直接来判定是否需要更多的信息。
- Highway Networks
- CTF---编程入门第一题 循环
- Z.ExtensionMethods 一个强大的开源扩展库
- 【干货】神经网络SRU
- AutoMapper 使用实践
- CTF---安全杂项入门第二题 A记录
- PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
- 手把手带你进入TOP20的商超销售预测
- 【干货荟萃】机器学习&深度学习知识资料大全集(二)(论文/教程/代码/书籍/数据/课程等)
- 逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
- 【专知-Java Deeplearning4j深度学习教程06】用卷积神经网络CNN进行图像分类
- 万恶的剪贴板==》为存储而生
- AdaBoost算法(R语言)
- CTF---Web入门第六题 因缺思汀的绕过
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Resin4配置 By HKL, Thursday 11
- 从源码编译N(ginx)+M(ySQL)+P(HP)并安装WordPress By HKL,
- MPEG4视频中,I帧、p帧、B帧的判定(转载) By HKL,
- 使用attrib命令解决存储器中毒后文件夹被隐藏的方法 By HKL,
- 在Archlinux上通过qemu运行ReactOS By HKL,
- Archlinux下解决wireshark普通用户抓包权限问题 By HKL,
- 使用jemalloc对nginx进行优化 By HKL,
- 配置IIS6+PHP5.6+MySQL5 By HKL,
- haproxy与nginx集成实例 By HKL, Wed
- 通过JavaScript实现HTTP到HTTPS的强制跳转 By HKL,
- 在Windows10 Bash中默认启动其他shell By HKL,
- 基于R的竞争风险模型的列线图
- 安装zabbix的windows系统agent By HKL,
- NetBSD使用sysupgrade工具更新系统 By HKL,
- asterisk服务器的sip、iax2中继对接 By HKL,