通过shell脚本监控sql执行频率

在生产环境中,可能会存在各种潜在的sql问题,比如由于硬件资源导致,如果影响到了IO,CPU,就会导致一些本来运行很快的sql语句变慢或者系统响应严重减缓。
比如由于数据库的一些设置导致执行计划的问题,sql_profile导致的执行计划稳定带来的性能不稳定,表中统计信息的变更导致的执行计划的变化等等。
有时候等到问题发生的时候,可能已经发生较长的一段时间了。如果想一下子定位问题还是很困难的,在sql_id没有发生变化的情况下,如果要查看语句的执行频率,一种可能就是通过在awr中筛查,但是可行性太差。毕竟耗时费力,还不灵活,很有可能问题sql的执行时间再特定的几个时间段内,那么完整的抽取也就有些冗余了,针对性不强。这个时候可以使用脚本来抽取DBA_HIST_SQLSTAT的信息,然后结合快照信息,得到一个快照级的sql语句执行情况。
shell脚本的内容如下:

sqlplus -s $DB_CONN_STR@$SH_DB_SID
set linesize 200
col BEGIN_INTERVAL_TIME format a30
set pages 50
select * from (
select
BEGIN_INTERVAL_TIME,
SQL_ID,
 sum(CPU_TIME_DELTA),
sum(DISK_READS_DELTA),
sum(Executions_total),
sum(EXECUTIONS_DELTA),
count(*)
from
DBA_HIST_SQLSTAT a, dba_hist_snapshot s
where
s.snap_id = a.snap_id
and to_char(s.begin_interval_time,'yyyymmdd')='$3'
and EXTRACT(HOUR FROM S.END_INTERVAL_TIME) between $1 and $2
and sql_id='$4'
group by
SQL_ID,
executions_total,
EXECUTIONS_DELTA,
BEGIN_INTERVAL_TIME
order by
sum(CPU_TIME_DELTA) desc)
where rownum

exit
EOF

执行脚本的情况如下:
我们想查看在2014年11月9号的1点到22点之间,sql_id 7sx5p1ug5ag12的执行频率,得到的结果如下:

ksh showsqlhist.sh 1 22 20141109 7sx5p1ug5ag12

BEGIN_INTERVAL_TIME            SQL_ID        SUM(CPU_TIME_DELTA) SUM(DISK_READS_DELTA) SUM(EXECUTIONS_TOTAL) SUM(EXECUTIONS_DELTA)   COUNT(*)
------------------------------ ------------- ------------------- --------------------- --------------------- --------------------- ----------
09-NOV-14 05.00.39.436 AM      7sx5p1ug5ag12             1071833                     0                 59785                 11712          1
09-NOV-14 12.00.25.211 AM      7sx5p1ug5ag12             1040858                     0                 48075                 12052          1

可以简单的验证一下。比如我们想查看12:00左右的时候sql_id 7sx5p1ug5ag12 的执行情况。来得到一个awr报告。

Executions Rows Processed Rows per Exec Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text
12,052 12,052 1.00 1.03 101.5 0 7sx5p1ug5ag12 DBMS_SCHEDULER SELECT SPARE4 FROM SYS.OPTSTAT...

或者来反证,可能绝大多数时候发现问题的时候,我们会生成awr报告,如果看到某些sql语句可能存在问题,可以使用脚本得到一个语句的执行频率,结合快照来看更加具有针对性。
对于排查问题来说还是有一定的帮助的。

时间: 2024-09-15 07:43:32

通过shell脚本监控sql执行频率的相关文章

通过shell脚本监控日志切换频率

在数据库遇到性能问题的时候,可能从io,cpu等角度能够下手找到性能瓶颈,日志的切换也是影响性能的一个因素,如果日志切换台频繁,等待时间就会在日志相关的事件上,从数据库的角度来说,肯定是io的瓶颈. 可以通过如下的shell脚本来得到一个简单的报告. 脚本如下: sqlplus -s $DB_CONN_STR@$SH_DB_SID set linesize    150 set pages       100 set feedback    off set verify      off col

用shell脚本监控进程是否存在 不存在则启动的实例_linux shell

用shell脚本监控进程是否存在 不存在则启动的实例,先上代码干货: #!/bin/sh ps -fe|grep processString |grep -v grep if [ $? -ne 0 ] then echo "start process....." else echo "runing....." fi ##### processString 表示进程特征字符串,能够查询到唯一进程的特征字符串 0表示存在的 $? -ne 0 不存在,$? -eq 0 存

linux shell 脚本 代码的执行

问题描述 linux shell 脚本 代码的执行 1) if kill -0 cat $pid > /dev/null 2>&1; then 2) echo $command running as process 3) cat $pid.Stop it first. 4) exit 1 5) fi 求解1)是什么意思怎么执行, 不知道是 (1) tmp0 = cat $pid 其中的值,在执行 (2) tmp1=kill -0 tmp0 (3) tmp2=tmp1> /dev/

Oracle重建索引Shell脚本、SQL脚本分享_oracle

索引是提高数据库查询性能的有力武器.没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难.然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应变化,因此可以对这些变化较大的索引进行重构以提高性能.N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引.但Oracle现在强烈建议不要定期重建索引.具体可以参考文章:Oracle 重建索引的必要性.尽管如此重建索引还是有必要的,只是不

linux中shell脚本监控网站80端口与网站是否正常

监控网站80端口 很多时候我们不知道网站80端口是否正常,当然我以前的shell监控网站状态(续)这篇文章也可以监控网站,这里只是给大家提供另外一个思路去监控网站. 脚本内容:  代码如下 复制代码 vi check-80.sh #!/bin/bash nmap -P0 -p80 -sS -vv blog.slogra.com|grep 80 |tail -n1>/tmp/nmap.txt check_80=`cat /tmp/nmap.txt|awk '{print $2}'` if [ &quo

linux中利用shell脚本监控网站状态异常

  最近刚好需要测试一下新建站的稳定性,所以写了个SHELL脚本放到本机(最近换了mac本),能够实时查看你需要监控的WEB页面状态,并发送到指定邮箱.     这里赞一下OS X自带有crontab计划任务,可以直接在本机测试脚本啦^_^    代码如下 复制代码 # vi check_web_alive.sh --------------------------------------------------------------------- #!/bin/bash PATH=/bin:

Linux/Unix shell 脚本监控磁盘可用空间

    Linux下监控磁盘的空闲空间的shell脚本,对于系统管理员或DBA来说,必不可少.下面是给出的一个监控磁盘空间空间shell脚本的样本,供大家参考.   1.监控磁盘的空闲空间shell脚本 robin@SZDB:~/dba_scripts/custom/bin> more ck_fs_space.sh #!/bin/bash # -----------------------------------------------------------------------------

Shell脚本避免重复执行的方法_linux shell

很多用cron定时执行的shell脚本可能会由于各种原因执行很久,会有必要在运行的时候先检查一下自身是否还在运行.本文提供的linux shell脚本用以检查以命令sh ...来执行的shell脚本.要对其他东西进行唯一性检查,可以稍微修改一下源代码. 复制代码 代码如下: # 检查通过sh命令执行的shell脚本是不是还在执行当中,避免重复执行. # 把这段代码放在需要保证唯一性的程序头部即可 # 注意,如果直接把此脚本放到cron里面执行的话,必须再grep -v " -c sh "

linux下用shell脚本启动可执行.jar文件并关闭的方法

话不多说,开始上代码,为了偷懒,代码只是截图了,感兴趣的朋友可以看了之后自己写,这样加深印象. 上面是小弟写的shell脚本.写的不好请见谅. 首先遇到的第一个坑 我在window下写的 然后道linux中执行,在linux死活都说俺的19行有错误,俺就不明白了,哪里有错,问了下别人,也说没错.突然有个高人问我在哪编写的,小弟回答在win下,他告诉俺执行下这个命令: dos2unix server.sh 然后小弟就执行了,说命令不存在,小弟只好安装这个,执行了以下命令 yum install d