通过shell脚本抓取awr报告中的问题sql

简介: awr报告中的sql明细部分基本必看的部分,尤其是SQL Order by Elapsed time这个部分,能够很清晰的看到哪些sql语句占用了较多的DB time,所占的比例。
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 %CPU %IO SQL Id SQL Module SQL Text
3,601.90 0   48.52 99.77 0.16 dfb15m5s2uwmc JDBC Thin Client SELECT :1, machinecode, cn, co...
1,612.04 21 76.76 21.71 99.97 0.00 8tmf11fvxy09j JDBC Thin Client SELECT ROUND(AVG(SUM(END_TIME...
1,593.80 20 79.69 21.47 99.97 0.00 cy55p6nrd31db JDBC Thin Client SELECT MAX(USER_CLASS) FROM S...
298.34 20 14.92 4.02 99.96 0.00 29tdwfv5d9s4f JDBC Thin Client SELECT NVL(SUM(OTAL), ...
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 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

输出的内容结果如下,和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,直接来判定是否需要更多的信息。
--------------------------------
2016年12月30日更新
可以使用更新后的分析函数,效果要好一些。输入起始和结束的快照号 比如sh  showsnapsql.sh 100 101


sqlplus -s $DB_CONN_STR@$SH_DB_SID break on db_name
set pages 50
set linesize 100
col elapsed_time format 99999999.99
col cpu_time format 99999999.99
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 * from (
select distinct snap_id,sql_id,EXECUTIONS_DELTA,round(ELAPSED_TIME_DELTA/1000000,2) Elapsed_time,round(ratio_to_report(ELAPSED_TIME_DELTA) over() *100,2)||'%' per_total
 from dba_hist_sqlstat where snap_id=$2
 order by 4 desc)
where rownum
select * from (
select distinct snap_id,sql_id,EXECUTIONS_DELTA,round(CPU_TIME_DELTA/1000000,2) CPU_time,round(ratio_to_report(CPU_TIME_DELTA) over() *100,2)||'%' per_total
 from dba_hist_sqlstat where snap_id=$2
 order by 4 desc)
where rownum
EOF
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
|
23天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
3月前
|
存储 SQL Go
全网最长的sql server巡检脚本分享(1000行)
全网最长的sql server巡检脚本分享(1000行)
54 1
|
3月前
|
SQL 存储 Go
SQL Server一键巡检脚本分享
SQL Server一键巡检脚本分享
30 0
|
3月前
|
SQL 监控 安全
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
|
3月前
|
SQL 存储 Oracle
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
64 0
|
3月前
|
SQL 运维 Oracle
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
46 0
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
79 1
|
22天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
45 2
6种方法打造出色的Shell脚本
|
8天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
29 1
下一篇
无影云桌面