通過shell指令碼同時監控多個資料庫負載
在平時的工作中,需要管理的資料庫還是很多的,因為遠端和許可權的關係,訪問不了一些圖形工具,有時候做檢查的時候感覺都是一個序列的過程,這樣檢查針對性就不夠強了,比如我們不知道在檢查的這個時間範圍內,資料庫的負載是在什麼範圍內,如果有些庫的負載極高,就需要格外注意,進行更有針對性的分析和檢查,要不假設有20個庫需要同時管理,沒有重點,眉毛鬍子一把抓還是很頭疼的。檢視資料庫的負載還是一個不錯的指標,我們可以根據這個基準來同時監控多個資料庫,基本能夠在一個大螢幕內顯示就可以了。
自己專門寫了指令碼,發現效果還是不錯的。這樣資料庫的負載就很清晰了,哪些庫在忙需要重點關注,哪些庫還基本處於休眠狀態,可以不用太關注。
實現的指令碼如下:
#getload.sh
function showsnap
{
sqlplus -s $1 <
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
自己專門寫了指令碼,發現效果還是不錯的。這樣資料庫的負載就很清晰了,哪些庫在忙需要重點關注,哪些庫還基本處於休眠狀態,可以不用太關注。
實現的指令碼如下:
#getload.sh
function showsnap
{
sqlplus -s $1 <
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1593351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過shell指令碼監控oracle session指令碼OracleSession
- 【轉載】監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- [轉]監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 監控Oracle資料庫的常用shell指令碼(轉)Oracle資料庫指令碼
- 通過shell指令碼監控sql執行頻率指令碼SQL
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- 資料庫監控指令碼資料庫指令碼
- 監控資料庫指令碼資料庫指令碼
- 使用shell指令碼檢視資料庫負載情況指令碼資料庫負載
- 通過shell指令碼監控日誌切換頻率指令碼
- 透過shell指令碼監控oracle session指令碼OracleSession
- 8個DBA最常用的監控Oracle資料庫的常用shell指令碼Oracle資料庫指令碼
- 8個DBA最常用的監控Oracle資料庫的常用shell指令碼--Oracle資料庫指令碼
- [zt]資料庫監控指令碼資料庫指令碼
- 資料庫監控指令碼(一)資料庫指令碼
- 資料庫監控指令碼(二)資料庫指令碼
- 資料庫監控指令碼(三)資料庫指令碼
- 通過shell指令碼得到資料庫的基本資訊(一)指令碼資料庫
- 8個DBA最常用的監控Oracle資料庫的常用shell指令碼--轉Oracle資料庫指令碼
- 多臺kafka同時啟動shell指令碼Kafka指令碼
- 【shell】磁碟監控指令碼指令碼
- 資料庫效能SQL監控指令碼資料庫SQL指令碼
- 通過shell得到資料庫中許可權的指令碼資料庫指令碼
- 幾個重要的指令碼來監控Oracle資料庫指令碼Oracle資料庫
- 監控DB2資料庫指令碼DB2資料庫指令碼
- 通過shell指令碼得到資料字典的資訊指令碼
- AIX系統資源監控SHELL指令碼AI指令碼
- shell監控mysql 8.0資料庫MySql資料庫
- shell監控mysql 5.7資料庫MySql資料庫
- 使用shell指令碼檢視資料庫負載情況(第二篇)指令碼資料庫負載
- 透過shell指令碼監控sql執行頻率指令碼SQL
- Shell----監控CPU/記憶體/負載高時的程式記憶體負載
- 通過shell指令碼新增備庫日誌指令碼
- oracle會話監控shell指令碼Oracle會話指令碼
- Shell 系統資訊監控指令碼指令碼
- 通過shell指令碼檢視資料庫表空間使用情況指令碼資料庫
- 透過shell指令碼監控日誌切換頻率指令碼