admin 发表于 2020-1-16 15:09:50

informix巡检脚本(Linux,aix)

#!/bin/sh
#Author & Date :Xilai 09-08-11
#Version:0.35
#Modify by xilai 2011-10-17 fixed bug

usage(){
echo Usage:$(basename $0) + n
}

[ $# -lt 1 ]&&{
usage
exit 1
}
echo $1|grep -qv '[^0-9]'
rt=$?
[ $rt -ne 0 ] && {
usage
exit 5
}

check_os(){
(uname -a|grep Linux)&&return 1;
(uname -a|grep AIX)&&return 2;
(uname -a|grep HP)&&return 3;
}

[ `id -g` -eq `id -g informix` ] || {
echo 'Permission Denied!'
exit 2
}
#Check env

[ "$INFORMIXDIR" -a "$INFORMIXSERVER" ] || {
echo 'Please Set Informix env First!'
exit 3
}

onstat - >/dev/null
[ $? -eq 5 ]||{
echo Please start ids First ..
exit 4
}
p1=$1
if [ ! $p1 ];then
      p1=1000
fi

echo_title()
{
      echo >>$OUTPUT
      echo ${index}. $* >> $OUTPUT
      #((index++))
      let index=$index+1
      echo >> $OUTPUT
}
echo_back()
{
[ $(echo $SHELL|grep bash|wc -l) -eq 1 ]&&{
      echo -n $*
}||{
      echo "$*\c"
}
}

DATE=$(date '+%Y%m%d')
DIR=monitor${DATE}/$INFORMIXSERVER
cd /tmp
rm -fr $DIR
mkdir -p ${DIR}
cd $DIR
OUTPUT=monitor.rep
touch $OUTPUT
index=1
DFUS=85
COMNAME=$0
DF="df -v"
if [ $(uname|grep HP|wc -l) -eq 1 ];then
       DF="bdf"
else
       DF="df -v"
fi

#System Command...

if [ "$ONCONFIG" ];then
      onconfig=$ONCONFIG
else
      onconfig=onconfig
fi

onlog=$(cat ${INFORMIXDIR}/etc/${onconfig}|grep -v "^#"|grep MSGPATH|awk '{print $2}')
if [ ${SHELL} = '/bin/bash' ];then
         PROFILE=.bash_profile
else
         PROFILE=.profile
fi
cp /etc/hosts .
cp /etc/services .
cp $INFORMIXDIR/etc/sqlhosts .
cp $INFORMIXDIR/etc/$onconfig .
cp ${HOME}/${PROFILE} .
cp ${onlog} .
#cp /var/adm/syslog/syslog.log .

echo_back Collecting System Information ...
#cpus=$(cat /proc/cpuinfo |grep processor|wc -l)
check_os>/dev/null
os=$?
case $os in
1)
      cpus=$(cat /proc/cpuinfo |grep processor|wc -l)
      #mem=$(vmstat|sed -n '/swpd/{n;p;}'|awk '{print $4+$5+$6}')
      mem=$(free |grep Mem|awk '{print $2}')
      ;;
2)
      #cpus=$(vmstat|grep "System configuration"|awk -F"[ |=]" '{print $4}')
      cpus=$(lsdev -Cc processor|wc -l)
      mem=$(vmstat|grep -i "System configuration"|awk -F"[ |=]" '{print $6}')
      ;;
3)
      cpus=$(machinfo|grep "logical processors"|awk '{print $1}')
      mem=$(machinfo|grep "Memory"|awk '{print $2 $3}')
      ;;
esac
osver="$(uname)"
idsver="$(onstat -V)"
instance=$INFORMIXSERVER
echo_title System Information
echo succeeded
echo "Number of CPUS:${cpus}" >> $OUTPUT
echo "Total Memorys :${mem}" >> $OUTPUT
echo "OS Version    :${osver}" >> $OUTPUT
echo "IDS Version   :${idsver}" >> $OUTPUT
echo "Instance Name :${instance}" >> $OUTPUT

#Informix Command...

#onstat -g seg > onstat-gseg
#onstat -d > onstat-d
#onstat -g seg > onstat-gseg
#onstat -g iov > onstat-giov
#onstat -c > onstat-c
#onstat -l > onstat-l
#onstat -V > idsversion
#[ $(which i4gl 2>/dev/null) ]&&i4gl -V > 4glversion
#[ $(which esql 2>/dev/null) ]&&esql -V > esqlversion

db_list=$(dbaccess sysmaster << %% 2>/dev/null
      output to pipe "cat" without headings
      select name from sysdatabases
      where name not in ("sysmaster","sysutils","sysuser","onpload")
%%
)
db_list=$(echo $db_list|grep -v '^


)


#Informix SQL

echo_back Collecting Informix Extents Information...

dbaccess sysmaster << %% >/dev/null 2>&1
unload to seqscan.txt delimiter ' '
select first 20 dbsname,tabname,round(sum(seqscans)) from sysmaster:sysptprof
where tabname<>'sys' and seqscans > 0
group by 1,2 order by 3 desc;
unload to ext delimiter ' '
select first 20 dbsname,tabname,count(*)
from sysmaster:sysextents
where tabname<>'sys'
group by 1,2
order by 3 desc;
unload to bigtable.txt delimiter ' '
select first 20 dbsname,tabname,name,sum(size),round(sum(size)*100/16775134,2)
from sysextents a,syschunks b,sysdbspaces c
where trunc(a.start/1048576,0)=b.chknum and b.dbsnum=c.dbsnum
group by 1,2,3
order by 4 desc;
unload to bigtable1.txt delimiter ' '
select first 20 dbsname,tabname,name,sum(size),round(sum(size)*100/16775134,2)
from sysextents a,syschunks b,sysdbspaces c
where a.chunk=b.chknum and b.dbsnum=c.dbsnum
group by 1,2,3
order by 4 desc;
%%
echo_title Extents Information
#echo "      Database               Tableexts   nrowspageusednextsize" >> $OUTPUT
echo "            Database                         Table         exts         nrows   pageused   nextsize">> $OUTPUT
echo "    ---------------- ----------------------------- -------------- --------------- ------------ ------------">>$OUTPUT
#echo "    -----------   ----------------- ----   ----------------------" >> $OUTPUT
cat ext|while read dbs tab exts;do
      oncheck -pt ${dbs}:${tab}>temp.txt
      [ $? -ne 0 ]&&continue
      nexts=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of extents"|awk '{sum+=$4}END{printf "%15d",sum}')
      nrows=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of rows"|awk '{sum+=$4}END{printf "%15d",sum}')
      npages=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of pages used"|awk '{sum+=$5}END{printf "%8d", sum}')
      nextsize=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Next extent size"|awk '{sum+=$4}END{printf "%8d",sum}')
#       echo -e "${dbs}\t${tab}\t${nexts}\t${nrows}\t${npages}\t${nextsize}" >> $OUTPUT
      #printf "%15s%20s%5d %8d   %5d   %5d\n" ${dbs} ${tab} ${nexts} ${nrows} ${npages} ${nextsize} >> $OUTPUT
      printf "%20s%30s%15d %15d   %8d   %8d\n" ${dbs} ${tab} ${nexts} ${nrows} ${npages} ${nextsize} >> $OUTPUT
done
echo "succeeded"
#Sequan Scan
echo_back Collecting Informix Sequence Scans Information...
echo_title Seqscan Information
echo "                      Database                         Table            seqs               nrows       pageused" >> $OUTPUT
echo "    -------------------------- ----------------------------- -------------- ---------------------------------" >> $OUTPUT
cat seqscan.txt|while read dbs tab seqs;do
      oncheck -pt ${dbs}:${tab}>temp.txt
      [ $? -ne 0 ]&&continue
      nexts=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of extents"|awk '{sum+=$4}END{printf "%15d",sum}')
      nrows=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of rows"|awk '{sum+=$4}END{printf "%15d", sum}')
      npages=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Number of pages used"|awk '{sum+=$5}END{printf "%15d", sum}')
      nextsize=$(cat temp.txt|sed -e '/Extents/,$ d'|grep "Next extent size"|awk '{sum+=$4}END{printf "%15d", sum}')
      printf "%30s%30s%15.0f %20d   %10d\n" ${dbs} ${tab} ${seqs} ${nrows} ${npages} >> $OUTPUT
done
echo "succeeded"
#Big Tables
echo_back Collecting Informix Big Tables Information...
echo_title Big Tables Information
echo "            Database                   Table               name            size         size(%)" >> $OUTPUT
echo "       -------------       -----------------       --------------   ---------------------------" >> $OUTPUT
cat bigtable.txt > bigtable 2>/dev/null
cat bigtable1.txt >> bigtable 2>/dev/null
cat bigtable| while read a b c d e;do
printf "%20s    %20s %20s %15.2f %15.2f\n" $a $b $c $d $e>> $OUTPUT
done
echo "succeeded"
#onstat -u
echo_back Collecting Informix Serial Column Informations...
echo_title Serial Information
for db in ${db_list};do
       dbaccess ${db} << %% >/dev/null 2>&1
       unload to serial_num.$db.txt delimiter ' '
       select first 20 b.tabname,max(a.ti_serialv),round(max(a.ti_serialv)*100/2147483647,2)
       from sysmaster:systabinfo a,sysmaster:systabnames b,systables c
       where b.tabname=c.tabname and b.dbsname="$db" and a.ti_partnum=b.partnum
       group by 1 order by 2 desc;
%%
    cat serial_num.$db.txt|while read a b c;do
      printf "%20s %20s %10.2f %10.2f\n" $db $a $b $c >> $OUTPUT
    done
done

echo "succeeded"
echo_title Onstat -u Information
onstat -u|grep -v '^


|tail -n 1 >> $OUTPUT

#onstat-k
echo_title Onstat -k Information
onstat -k|grep -v '^


|tail -n 1 >> $OUTPUT

#Total Memory of database

echo_title Total Memory of database
echo_back Total Memory: >> $OUTPUT
onstat -g seg|grep Total|awk '{print $4}' >> $OUTPUT

echo_title Total Space of database \(Page\)
ps=$(onstat -b|grep "Buffer pool page size:"|awk -F: '{print $2/1024}')
echo "   namenchunks          size            used         free    ratio" >> $OUTPUT
echo "------- ------- ------------------------------------------ -----">> $OUTPUT

dbaccess sysmaster << %% 1>/dev/null 2>/dev/null
unload to dbinfo delimiter " "
select a.name,count(*),trunc(sum(chksize)),
trunc((sum(chksize)-sum(b.nfree))),
trunc(sum(b.nfree)),trunc((sum(chksize)-sum(b.nfree)))/trunc(sum(chksize))*100
from sysmaster:sysdbspaces a,sysmaster:syschunks b
where a.dbsnum=b.dbsnum
group by 1
%%
cat dbinfo| while read a b c d e f;do
printf "%10s    %2.0f %15.2f %15.2f %15.2f %2.2f\n" $a $b $c $d $e $f>> $OUTPUT
done
#onstat -l
echo_title Phy and logical log Information

physize=$(onstat -l|sed -n '/physize/{n;p;}'|awk '{print $2}')
numlogs=$(onstat -l|grep -v "^$"|tail -n 1)
logisizes=$(onstat -l|sed -n '/address/,/active/p'|grep -E -v "address|active"|awk '{sum+=$6}END{print sum}')

echo Physical log size:$physize >> $OUTPUT
echo Number of Logical log:$numlogs >> $OUTPUT
echo Logical log size:$logisizes >> $OUTPUT
#Database Information
echo_title Database Information

for db in ${db_list};do
       all=$(dbaccess ${db} << %% 2>/dev/null
       unload to ${db}.tmp delimiter " "
       select a.name,b.site,a.owner,case when is_logging=0 then 'N' when is_logging=1
       then case when is_buff_log=1 then 'B' when is_buff_log=0 then 'U' end end
       from sysmaster:sysdatabases a,systables b
       where name="$db" and tabname=' GL_COLLATE' and
       name not in ("sysmaster","sysutils","sysuser","onpload");
       unload to serial_num.$db.txt
       select first 20 b.tabname,max(a.ti_serialv),round(max(a.ti_serialv)*100/2147483647,2)
       from sysmaster:systabinfo a,sysmaster:systabnames b,systables c
       where b.tabname=c.tabname and b.dbsname=$db and a.ti_partnum=b.partnum
       group by 1 order by 2 desc;
%%
)
#       echo -e "${db}\t${all}" >> $OUTPUT
       cat ${db}.tmp >> $OUTPUT
       echo >> $OUTPUT
       dbschema -d ${db} -ss ${db}.sql >/dev/null
done

#onstat-p

echo_back Collecting Database Information...

echo_title Onstat-p Information

readcached=$(onstat -p|awk '{print $4}'|sed -n '/cached/{n;p;}')
writecached=$(onstat -p|awk '{print $8}'|sed -n '/cached/{n;p;}')
ixdara=$(onstat -p|awk '{print $1}'|sed -n '/ixda-RA/{n;p;}')
idxra=$(onstat -p|awk '{print $2}'|sed -n '/idx-RA/{n;p;}')
dara=$(onstat -p|awk '{print $3}'|sed -n '/da-RA/{n;p;}')
rapgsused=$(onstat -p|awk '{print $4}'|sed -n '/RA-pgsused/{n;p;}')

echo Buffer Read %cached:$readcached >> $OUTPUT
echo Buffer Write %cached:$writecached>> $OUTPUT
echo ixda-RA:${ixdara}>> $OUTPUT
echo idx-RA:${idxra}>> $OUTPUT
echo da-RA:${dara}>> $OUTPUT
echo RA-pgsused:${rapgsused}>> $OUTPUT

$DF|grep -v Filesystem|grep -v "-"|while read filesystem kb used ava usepe mp;do
       ud=$(echo $usepe|sed 's/%//g')
       [ $ud -gt ${DFUS} ] && echo Directory $mp \'s usage ratio is more than ${DFUS}% >> $OUTPUT||continue
done
echo "succeeded"

#onstat -g seg
echo_title Onstat -g seg Information

segc=$(($(onstat -g seg|grep V|wc -l)-2))
frbk=$(onstat -g seg|grep Total|awk '{print $8}')

echo 'Num of VP is:'$segc >> $OUTPUT
echo 'blkfree is:'$frbk >> $OUTPUT

echo_back Collecting VP Information...
touch monitor.tmp
i=1
#for((i=1;i<=${p1};i++));do
while [ $i -le ${p1} ];do

      echo "vmstat-${i}" >> monitor.tmp
      vmstat 1 10 >> monitor.tmp
      echo "sar-r-${i}" >> monitor.tmp
      echo "onstat-g-glo-${i}" >> monitor.tmp
      onstat -g glo >> monitor.tmp
      echo "onstat-D-${i}" >> monitor.tmp
      i=$((i+1))
      sleep 30
done

#VP

echo_title Virtual Class Information
sed -n '/^onstat-g-glo-1$/,/^onstat-D-1$/ p' monitor.tmp|sed -n \
'/Virtual processor summary:/,/Individual virtual processors:/ p' >onstat-g-glo-1
sed -n "/^onstat-g-glo-${p1}$/,/^onstat-D-${p1}$/ p" monitor.tmp|sed -n \
'/Virtual processor summary:/,/Individual virtual processors:/ p' >onstat-g-glo-${p1}
echo 'class   vpsusercpusyscpu   total' >>$OUTPUT
echo '---------   ------------    ------'>>$OUTPUT
for j in "cpu" "aio" "lio" "pio" "adm" "msc" "soc";do




      cat onstat-g-glo-1|grep -w ${j} >/dev/null
      [ $? -ne 0 ]&&continue
      vps1=$(cat onstat-g-glo-1|grep -w ${j}|awk '{print $2}')
      usercpu1=$(cat onstat-g-glo-1|grep -w ${j}|awk '{print $3}')
      syscpu1=$(cat onstat-g-glo-1|grep -w ${j}|awk '{print $4}')

      vpsi=$(cat onstat-g-glo-${p1}|grep -w ${j}|awk '{print $2}')
      usercpui=$(cat onstat-g-glo-${p1}|grep -w ${j}|awk '{print $3}')
      syscpui=$(cat onstat-g-glo-${p1}|grep -w ${j}|awk '{print $4}')

      usercpu=$(echo ${usercpui}-${usercpu1}|bc)
      syscpu=$(echo ${syscpui}-${syscpu1}|bc)
      total=$(echo ${usercpu}+${syscpu}|bc)
#       echo -e " $j\t${vpsi}\t${usercpu}\t${syscpu}\t${total}" >> $OUTPUT
      printf "%5s   %3d   %6.2f%6.2f   %7.2f\n" $j ${vpsi} ${usercpu} ${syscpu} ${total} >> $OUTPUT
done
echo "succeeded"

#CPU
echo_back Collecting System CPU Information...

echo_title CPU Information

if [ $(uname|grep AIX|wc -l) -eq 1 ];then
      sed -n '/vmstat/,/sar-r/ p' monitor.tmp|grep -E -v "procs|swpd|sar|vmstat|id|faults||^$"|\
      awk '{print 0" "$4" "$16}' > cpu.tmp
else
if [ $(uname|grep HP|wc -l) -eq 1 ];then
      sed -n '/vmstat/,/sar-r/ p' monitor.tmp|grep -E -v "procs|swpd|sar|vmstat|id|faults||^$"|\
      awk '{print 0" "$5" "$18}' > cpu.tmp
else
      sed -n '/vmstat/,/sar-r/ p' monitor.tmp|grep -E -v "procs|swpd|sar|vmstat|id|faults||^$"|\
      awk '{print $3" "$4" "$15}' > cpu.tmp
fi
fi

max=$(awk 'BEGIN{max=0}{max=(max>$3)?max:$3}END{print max}' cpu.tmp)
min=$(awk 'BEGIN{min=100}{min=(min<$3)?min:$3}END{print min}' cpu.tmp)
cpuv=$(awk '{sum+=$3}END{printf "%5.2f\n",sum/NR}' cpu.tmp)
dbcpu=$(dbaccess sysmaster << %% 2>/dev/null
      output to pipe "cat" without headings
SELECT
      (SELECT SUM(usercpu)+SUM(syscpu) FROM sysvpprof)/
      (SELECT (dbinfo('UTC_CURRENT') - sh_pfclrtime) FROM sysshmvals)/
      (SELECT cf_effective FROM sysconfig WHERE cf_name = 'NUMCPUVPS')*100
       AS CPU_used_ratio
FROM systables
WHERE tabid=1
%%
)
swap=$(awk '{sum+=$1}END{printf "%5.2f\n",sum/NR}' cpu.tmp)
echo Average of OS CPU Idle:$cpuv >> $OUTPUT
echo Database CPU used ratio :$dbcpu >>$OUTPUT
echo The Max CPU Idel is   :$max >> $OUTPUT
echo The Min CPU Idel is   :$min >> $OUTPUT
echo Swap Spaces usage is    :$swap >> $OUTPUT

echo_back Deleting temp files...

rm -fr ext cpu.tmp onstat-d.tmponstat-g-glo-1onstat-g-glo-2seqscan.txttemp.txt
echo "succeeded"
echo "Completed!"
echo >> $OUTPUT
echo "The End ..." >> $OUTPUT


页: [1]
查看完整版本: informix巡检脚本(Linux,aix)