通過Shell指令碼同時監控多個資料庫負載

來源:互聯網
上載者:User

通過Shell指令碼同時監控多個資料庫負載

在平時的工作中,需要管理的資料庫還是很多的,因為遠程和許可權的關係,訪問不了一些圖形工具,有時候做檢查的時候感覺都是一個串列的過程,這樣檢查針對性就不夠強了,比如我們不知道在檢查的這個時間範圍內,資料庫的負載是在什麼範圍內,如果有些庫的負載極高,就需要格外注意,進行更有針對性的分析和檢查,要不假設有20個庫需要同時管理,沒有重點,眉毛鬍子一把抓還是很頭疼的。查看資料庫的負載還是一個不錯的指標,我們可以根據這個基準來同時監控多個資料庫,基本能夠在一個大螢幕內顯示就可以了。

自己專門寫了Shell指令碼,發現效果還是不錯的。這樣資料庫的負載就很清晰了,哪些庫在忙需要重點關注,哪些庫還基本處於休眠狀態,可以不用太關注。

實現的指令碼如下:
#getload.sh
 function showsnap
 {
 sqlplus -s $1 <<EOF
 break on db_name
 set pages 50
 set linesize  65
 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
 begin_snap
 ,end_snap
 ,snapdate
 ,round(((END_INTERVAL_TIME+0)-(BEGIN_INTERVAL_TIME+0 ))*24*60) dur_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
      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.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')='$2'
    and EXTRACT(HOUR FROM END_INTERVAL_TIME) between $3-1 and $4+1
  order by db_name, instance_name, snap_id
  );
 EOF
 }

 


 curr_hr=`date '+%H'`
 pre_hr=`expr $curr_hr - 3`
 DATE=`date '+%Y%m%d'`
 #echo $curr_hr  $pre_hr
 SH_DB_SID=`echo "$1"|awk -F@ '{print $2}'|tr '[a-z]' '[A-Z]'`
 showsnap $1  $DATE $pre_hr $curr_hr > tmp_${SH_DB_SID}_${DATE}_load

 function format_rpt
 {
 awk '
 BEGIN{
 print "#################################################################"
 printf "%-65s\n","DB workload  "
 print "#################################################################"
 }
 {
 printf "%-65s\n",$0
 }' $1 > $2
 }
 format_rpt tmp_${SH_DB_SID}_${DATE}_load  ${SH_DB_SID}_${DATE}_load
 rm tmp_${SH_DB_SID}_${DATE}_load
 cat ${SH_DB_SID}_${DATE}_load

第二個指令碼是整合這些輸出結果的,使用動態地方式靈活指定監控的指標,
#showall.sh
 #get db load input getload
 #get db tsps input showtsps
 act_type=$1
 ksh ${act_type}.sh xxx/xxx@xxxx > tmp_b4 cat b7

比如我們有一個指令碼getload.sh是專門監控資料庫負載的,就可以運行指令碼 showall.sh getload即可。如果要查看錶空間使用方式,我們有指令碼showtsps.sh,就運行指令碼showall.sh showtsps即可。DB_CONN_STR=XXX/XXX
 #get db load input getload
 #get db tsps input showtsps
 act_type=$1

 #### DB01
 SH_DB_SID=XXX
 ksh ${act_type}.sh $DB_CONN_STR@$SH_DB_SID > a1

 #### DB02
 SH_DB_SID=XXX
 ksh ${act_type}.sh $DB_CONN_STR@$SH_DB_SID > a2

 #### DB03
 SH_DB_SID=XXX
 ksh ${act_type}.sh $DB_CONN_STR@$SH_DB_SID > a3

 cat a1
 paste a2 a3
 paste a4 a5
 paste a6  a7
 cat a8

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.