#!/bin/bash
# Program:
# Automatic inspection operation system and oracle database.
# History:
# 2016/05/01 Liang Guojun First Release
#
#==============================================================================
# define variable
#==============================================================================
PATH=$PATH:$HOME/bin

export PATH

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=orcl

export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

#define ora_healthcheck base directory
ORAH_HOME=/home/oracle/ora_healthcheck

#define Oracle SID
ORAH_DB_SID=orcl

#define tablespace rate
ORAH_TBS_RATE=80

#define alert log size,unit:KB
ORAH_ALERT_SIZE=2097152

ORAH_HOSTNAME=onlinedb
ORAH_BIN=$ORAH_HOME/bin
ORAH_LOG=$ORAH_HOME/logs
ORAH_TMP=$ORAH_HOME/tmp
DATE=`date "+%Y%m%d-%H%M%S"`
rm -f $ORAH_TMP/*

#==============================================================================
# judge oracle SMON process status
#==============================================================================
ps_smon_ori=`ps -ef|grep smon | grep -v grep|grep -v root|grep -v asm|grep -v grid|awk '{print $NF}'`
ps_smon_sid=ora_smon_${ORAH_DB_SID}
if [ "${ps_smon_ori}" = "${ps_smon_sid}" ];then
db_is_down_smon=' '
else
db_is_down_smon='SEND'
fi

#==============================================================================
# judge instance open status
#==============================================================================
instance_status_ori=`sqlplus -S / as sysdba <<EOF
set pagesize 999
set linesize 180
col value format a100
select status from v\\$instance;
exit;
EOF`
instance_status=`echo ${instance_status_ori}|awk -F " " '{print $3}'`
if [ "${instance_status}" = "OPEN" ];then
db_is_down_status=' '
else
db_is_down_status='SEND'
fi

if [[ "${db_is_down_smom}" = "SEND" ]] || [[ "${db_is_down_status}" = "SEND" ]];then
echo "database ${ORAH_HOSTNAME},already Down!" | mutt -s "database ${ORAH_HOSTNAME},already Down!" test@139.com
else
echo "database status is OK!"
fi

#==============================================================================
# execute database tablespace free rate sql
#==============================================================================
sqlplus -S / as sysdba <<EOF > $ORAH_TMP/db_tbs.log
set linesize 160
set pagesize 999
col exclude for a18
col TBS_TOTAL_MB for 9999999
col TBS_USED_MB for 9999999
col TBS_FREE_MB for 9999999
col TBS_RATE for a11
col EXTEND_MAX_MB for 9999999
col EXTEND_FREE_MB for 9999999
col EXTEND_RATE for a11
select a.tablespace_name "excludethis",
round(current_size / 1024 / 1024, 1) TBS_TOTAL_MB,
round((current_size - b.free_bytes) / 1024 / 1024, 1) TBS_USED_MB,
round(b.free_bytes / 1024 / 1024, 1) TBS_FREE_MB,
round(((current_size - b.free_bytes) / current_size) * 100) || '%' TBS_RATE,
round(a.max_size / 1024 / 1024, 1) EXTEND_MAX_MB,
round((a.max_size - (current_size - b.free_bytes)) / 1024 / 1024) EXTEND_FREE_MB,
round(((current_size - b.free_bytes) / a.max_size) * 100) || '%' EXTEND_RATE
from (select tablespace_name,
sum(ddf.bytes) current_size,
sum(case
when ddf.autoextensible = 'YES' THEN
DDF.MAXBYTES
ELSE
DDF.BYTES
END) max_size
from dba_data_files ddf
group by tablespace_name
union
select tablespace_name,
sum(ddf.bytes) current_size,
sum(case
when ddf.autoextensible = 'YES' THEN
DDF.MAXBYTES
ELSE
DDF.BYTES
END) max_size
from dba_temp_files ddf
group by tablespace_name) a,
(select dfs.tablespace_name, sum(dfs.bytes) free_bytes
from dba_free_space dfs
group by dfs.tablespace_name
union
select tfs.tablespace_name, sum(tfs.BYTES_FREE) free_bytes
from v\$TEMP_SPACE_HEADER tfs
group by tfs.tablespace_name) b
where a.tablespace_name = b.tablespace_name(+);
exit;
EOF

#==============================================================================
# judge database tablespace free rate
#==============================================================================
grep -v "excludethis" $ORAH_TMP/db_tbs.log|grep -v "\-\-\-"|grep -v "rows selected">$ORAH_TMP/db_tbs_ori.log
sed -i '/^[[:space:]]*$/d' $ORAH_TMP/db_tbs_ori.log
TBS_RATE=`awk '{print $8}' $ORAH_TMP/db_tbs_ori.log|sed -e "s/%//g"`
TBS_RATE_LENGTH=`cat $ORAH_TMP/db_tbs_ori.log|wc -l`

for ((i=1;i<=${TBS_RATE_LENGTH};i++));do
TBS_RATE_SIZE=`awk '{print $8}' $ORAH_TMP/db_tbs_ori.log|sed -e "s/%//g"|sed -n ${i}p`
TBS_NAME=`awk '{print $1}' $ORAH_TMP/db_tbs_ori.log|sed -e "s/%//g"|sed -n ${i}p`
if [ ${TBS_RATE_SIZE} -gt ${ORAH_TBS_RATE} ];then
sed -n ${i}p $ORAH_TMP/db_tbs_ori.log>>$ORAH_TMP/db_tbs_rate_name.log
else
echo " "
fi
done;

TBS_RATE_NAME=`cat $ORAH_TMP/db_tbs_rate_name.log`
if [ -z "${TBS_RATE_NAME}" ];then
echo "tablespace is OK!"
else
echo "database ${ORAH_HOSTNAME},tablespace(${TBS_NAME}) if full" | mutt -s "database ${ORAH_HOSTNAME},tablespace(${TBS_NAME}) if full" test@139.com
fi

#==============================================================================
# get alert path
#==============================================================================
alertpath_ori=`sqlplus -S / as sysdba <<EOF
set pagesize 999
set linesize 180
col value format a100
select value from v\\$parameter where name='background_dump_dest';
exit;
EOF`

#==============================================================================
# judge alert size if more then 2G backup and touch new
#==============================================================================
alertpath=`echo $alertpath_ori|awk -F " " '{print $3}'`
alert_size=`du -k $alertpath/alert_${ORAH_DB_SID}.log |awk -F " " '{print $1}'`
alert_2g=' '
if [ ${alert_size} -gt ${ORAH_ALERT_SIZE} ];then
mv $alertpath/alert_${ORAH_DB_SID}.log $alertpath/alert_${ORAH_DB_SID}_${DATE}.log && touch $alertpath/alert_$ORAH_DB_SID.log
alert_2g='YES'
else
echo "alert size less then 2G"
fi

#==============================================================================
# judge alert log
#==============================================================================
if_alertout_null=$ORAH_LOG/alert_out.log

if [ "${alert_2g}" = "YES" ];then
cat $alertpath/alert_$ORAH_DB_SID.log> $ORAH_LOG/alert_out.log
lastnum=$(grep -n ".*" $alertpath/alert_$ORAH_DB_SID.log |tail -1|awk -F ":" '{print $1}')
echo ${lastnum} >$ORAH_LOG/alert_num.log
else

if [ ! -s "${if_alertout_null}" ];then
tail -n 100 $alertpath/alert_$ORAH_DB_SID.log> $ORAH_LOG/alert_out.log
lastnum=$(grep -n ".*" $alertpath/alert_$ORAH_DB_SID.log |tail -1|awk -F ":" '{print $1}')
echo ${lastnum} >$ORAH_LOG/alert_num.log
else
firstnum=`cat $ORAH_LOG/alert_num.log`
firstnum=`echo "scale=0;$firstnum+1"|bc`
lastnum=$(grep -n ".*" $alertpath/alert_$ORAH_DB_SID.log |tail -1|awk -F ":" '{print $1}')
echo ${lastnum} >$ORAH_LOG/alert_num.log
sed -n ''"$firstnum","$lastnum"'p' $alertpath/alert_$ORAH_DB_SID.log >$ORAH_LOG/alert_out.log
fi

fi

if_alert_null=`egrep 'ORA-|Heartbeat failed|Deadlock' $ORAH_LOG/alert_out.log`

if [ -z "${if_alert_null}" ];then
echo "alert log is OK!"
else
echo "database ${ORAH_HOSTNAME},alert log has problem" | mutt -s "database ${ORAH_HOSTNAME},alert log has problem" test@139.com
fi

#==============================================================================
# judge CPU
#==============================================================================
cpuuse=`top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }' |tr -d '%'`
cpunum=`awk -v num1=90 -v num2=$cpuuse 'BEGIN{print(num1>num2)?"0":"1"}'`
if [ $cpunum -eq 0 ];then
echo "CPU is Normal!"
else
echo "host ${ORAH_HOSTNAME},lack of CPU!" | mutt -s "host ${ORAH_HOSTNAME},lack of CPU!" test@139.com
fi

#==============================================================================
# judge Disk
#==============================================================================
diskuse=$(df -hP|grep -v "Filesystem" | grep -c -E \(9[0-9]\%\)\|\(100\%\))
if [ "${diskuse}" -gt 0 ];
then
echo "host ${ORAH_HOSTNAME},disk has full!" | mutt -s "host ${ORAH_HOSTNAME},disk has full!" test@139.com
else
echo "Disk is Normal!"
fi

#==============================================================================
# judge Memory
#==============================================================================
memuse=`free -m|grep Mem|awk '{print ($3-$6-$7)/$2}'`
memnum=`awk -v num1=$memuse -v num2=0.01 'BEGIN{print(num1>num2)?"0":"1"}'`
if [ $memnum -eq 0 ];then
echo "memory is Normal!"
else
echo "host ${ORAH_HOSTNAME},lack of memory!" | mutt -s "host ${ORAH_HOSTNAME},lack of memory!" test@139.com
fi

monitoring_db的更多相关文章

随机推荐

  1. inkscape

    最近的论文需要把latex公式放到图里,于是想起了装了之后一直没怎么用的inkscape.因为visio貌似没法直接贴latex格式的公式. 找了几个用法: http://blog.sciencene ...

  2. Android ScrollView 滚动到顶部

    有时候使用ScrollView,里边控件比较多的时候,打开界面,会滑到底部,如果要设置滑动到顶部,一般有两种方法 1.使用fullScrol(),scrollView.fullScroll(Scrol ...

  3. POJ 3253 Fence Repair C++ STL multiset 可解 (同51nod 1117 聪明的木匠)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 53106   Accepted: 17508 De ...

  4. Devexpress控件使用二:barManager

    1.拖放控件 2.两种按钮显示形式 1)上面是大图标,下面是说明 a.Add → Largebutton 注:勾选 Show DesignTime enancements 才会出现Add b.添加图片 ...

  5. 1806最大数 string和sort函数用法

    1.C++自带sort函数用法 sort函数有三个参数: (1)第一个是要排序的数组的起始地址 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小 ...

  6. Pyinstaller 0

    Pyinstaller 是一个小的可以打包我们所写的Python脚本,来生成相应的可执行文件. 它是怎么工作的? PyInstaller读取您编写的Python脚本.它会分析您的代码,以发现您的脚本执 ...

  7. Good Bye 2014 B. New Year Permutation 【传递闭包 贪心】

    解题思路:给出一列数an,再给出一个矩阵d[i][j],在满足d[i][j]=1的情况下,称a[i]和a[j]可以交换,问经过交换最后得到字典序最小的数列a[n] 首先是贪心的思想,大的能换就换到后面 ...

  8. XML文件基础,DTD校验文件编写,Schema文件的简单使用

    dtd <!-- <!ELEMENT 元素(子元素,...)> --> <!ELEMENT students (student+,cat*) > <!ELEM ...

  9. for 的相关用法

    forEach() <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  10. 服务器搭建域控与SQL Server的AlwaysOn环境过程(三)配置故障转移

    0 引言 主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的. 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Windows Server20 ...