十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章給大家介紹如何使用shell自動(dòng)化診斷性能問(wèn)題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站托管、服務(wù)器租用等一站式綜合服務(wù)型公司,專(zhuān)業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出成都創(chuàng)新互聯(lián)公司。
一直以來(lái)要做性能分析的自動(dòng)化工作,但是久久沒(méi)有動(dòng)筆,今天索性來(lái)更新一版。
首先我希望得到的一個(gè)基本效果就是后臺(tái)去掃描數(shù)據(jù)庫(kù)的DB time,如果超出了閾值,比如這里我設(shè)置的為400(即DB time為400%),則會(huì)開(kāi)啟自動(dòng)診斷的任務(wù)。時(shí)間范圍是提前一個(gè)小時(shí)和當(dāng)前時(shí)間。我對(duì)已有的腳本做了一些改動(dòng),加了一些邏輯,后續(xù)還會(huì)不斷完善。
DBTIME_THRESHOLD=400
DATE=`date '+%Y%m%d'`
BEGIN_HOUR=`date -d"1 hour ago" +"%H"`
END_HOUR=`date +"%H"`
下面的函數(shù)會(huì)得到快照級(jí)別的DB time情況
function showsnap
{
sqlplus -s $DB_CONN_STR@$SH_DB_SID <
set pages 0
set feedback off
set linesize 100
col snapdate format a20
select
begin_snap
,end_snap
,snapdate
,round(((END_INTERVAL_TIME+0)-(BEGIN_INTERVAL_TIME+0 ))*24*60) duration_mins
,round((select round((sum(e.value) -
sum(b.value)) / 1000000 /60,2) dbtime
FROM DBA_HIST_SYS_TIME_MODEL e, DBA_HIST_SYS_TIME_MODEL b
WHERE
e.STAT_NAME = 'DB time'
and b.snap_id=begin_snap
and e.snap_id =end_snap
AND b.STAT_NAME = 'DB time'
group by e.snap_id,b.snap_id)) dbtime
from
(
select
di.db_name db_name
, s.snap_id begin_snap
,lead(s.snap_id ,1,s.snap_id ) over(order by s.end_interval_time ) end_snap
, to_char(s.end_interval_time,'dd Mon YYYY HH24:mi') snapdate
, s.snap_level lvl
,s.end_interval_time
,s.begin_interval_time
from dba_hist_snapshot s
, dba_hist_database_instance di
where
( di.dbid,di.instance_number) in
(select d.dbid dbid
, i.instance_number inst_num
from v\$database d,
v\$instance i)
and di.dbid = s.dbid
and di.instance_number = s.instance_number
and di.startup_time = s.startup_time
and to_char(END_INTERVAL_TIME,'yyyymmdd')='$1'
and EXTRACT(HOUR FROM END_INTERVAL_TIME) between $2-1 and $3+1
order by instance_name, snap_id
);
EOF
}下面的函數(shù)會(huì)得到快照級(jí)別SQL的DB time占比圖。
function showsnapsql
{
sqlplus -s $DB_CONN_STR@$SH_DB_SID <
set pages 50
set linesize 100
col elapsed_time format a10
col per_total format a10
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;
EOF
}下面的函數(shù)會(huì)基于快照生成AWR報(bào)告。
function genawrhtml
{
awr_inputs=`sqlplus -s ${DB_CONN_STR}@${SH_DB_SID} <
SET HEAD OFF
SET PAGES 0
select d.dbid||','||i.instance_number||','||$1||','||$2||',0' text
from v\\\$database d,
v\\\$instance i ;
EOF`
sqlplus -s ${DB_CONN_STR}@${SH_DB_SID} <
set linesize 1500
set termout on;
spool awrrpt_$1_$2.lst
select output from table(dbms_workload_repository.awr_report_html( ${awr_inputs}));
#select output from table(dbms_workload_repository.awr_report_html( `cat awr_inputs.lst`));
spool off;
set termout off;
clear columns sql;
EOF
}下面的是執(zhí)行的主方法,當(dāng)然還有待完善。
#MAIN 主方法
tmp_dbtime_snap=`showsnap $DATE $BEGIN_HOUR $END_HOUR|awk -v dbtime=$DBTIME_THRESHOLD '{if($8>=dbtime) print $0}' |tail -1`
echo $tmp_dbtime_snap
dbtime_snap=`echo $tmp_dbtime_snap|awk '{print $1" " $2}'`
echo $dbtime_snap
#得到快照級(jí)別的SQL占用DB time情況showsnapsql $dbtime_snap#生成基于DB time的AWR報(bào)告genawrhtml $dbtime_snap上面的腳本執(zhí)行很簡(jiǎn)單,無(wú)需輸入任何參數(shù)。就會(huì)得到一個(gè)完整的數(shù)據(jù)報(bào)告。后續(xù)會(huì)通過(guò)郵件的形式來(lái)發(fā)送。后面會(huì)繼續(xù)補(bǔ)充完善。
關(guān)于如何使用shell自動(dòng)化診斷性能問(wèn)題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。