shell指令碼自動化採集效能sql

531968912發表於2015-12-26
透過v$sql_monitor能夠實時採集可能存在的sql效能問題,但是每次問題發生的時候採取採取措施就有點“晚”了,我們需要防患於未然,把一些潛在問題提前發現,並加以解決。

如果有些sql執行很頻繁,我們需要得到一個執行的報告,但是因為sql執行很頻繁,每次都生成一個報告就顯得有些過於消耗資源了。
現在想達到的目標就是能夠在每天早上上班的時候能夠得到一些已經生成的報告。如果有些sql已經生成過報告了,就不需要重複生成報告了,這樣一切問題都在監控之中。

採用的指令碼如下:
DATE=`date '+%y%m%d'`
sqlplus -s n1/n1 <<EOF
set pages 0
set feedback off
set linesize 100
set trimspool on
col sql_id format a50
spool tmp_monitor_sql.lst_$DATE
select sql_id from v\$sql_monitor where status='EXECUTING' and username='xxxx'
 group by sql_id;
spool off;
EOF

ls -lrt *_rpt.lst_$DATE*|grep -v tmp|awk -v DATE=$DATE 'BEGIN{FS="_rpt.lst_"} {print $1 }'|awk '{print $9}'|sort > tmp_current_exist_sql
sort tmp_monitor_sql.lst_$DATE > monitor_sql.lst_$DATE
comm -13 tmp_current_exist_sql monitor_sql.lst_$DATE > tmp_monitor_sql_minus.lst

issue_sql_cnt=`cat tmp_monitor_sql_minus.lst|wc -l`
for((i=1;i< ${issue_sql_cnt};i++))
do
tmp_sql_id=`sed -n ''$i'p' tmp_monitor_sql_minus.lst`


sqlplus -s  n1/n1 <<EOF
set pages 0
set linesize 150
col comm format a200
set long 99999
spool ${tmp_sql_id}_rpt.lst_$DATE
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '$tmp_sql_id',
report_level => 'ALL',
type=>'HTML'
) comm
FROM dual;
spool off;
EOF
done


rm tmp_monitor_sql_minus.lst
rm  tmp_monitor_sql.lst_$DATE
rm tmp_current_exist_sql
rm  monitor_sql.lst_$DATE



指令碼執行後結果如下:
如果有sql在執行超過5秒,耗用了大量的資源,就會被記錄下來。

[ora11g@rac1 tmp]$ ll
total 876
-rw-r--r-- 1 ora11g dba 103889 Jul 20 03:44 4dtvhq9n8s751_rpt.lst_140720
-rw-r--r-- 1 ora11g dba  77917 Jul 20 03:44 5zruc4v6y32f9_rpt.lst_140720
-rw-r--r-- 1 ora11g dba 403473 Jul 20 03:44 63n9pwutt8yzw_rpt.lst_140720
-rw-r--r-- 1 ora11g dba 119744 Jul 20 03:44 7hdtv2wcb63my_rpt.lst_140720


如果下次執行指令碼,報告已經存在,就不會重複生成報告了。
可以把這個指令碼設為crontab或者nohup模式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-1963520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章