使用shell批量监控磁盘坏块(二)

之前分享了第一篇 使用shell批量监控磁盘坏块(一),今天来简单说说这个需求的实现内容 。
首先主要思路是通过中控的机器来发送监控的细节,然后返回结果。

首先就是我们需要有一个服务器列表,里面会有这些需要的元数据信息。
比如列表如下:
192.127.133.13   某某服务中心主库           jeanron   Primary Linux   Oracle  N    xxx
192.127.133.12   某某服务备库           jeanron  Standby Linux   Oracle  N   xxxx
192.127.133.18   某某业务主库   jeanron  Primary Linux   Oracle  N       xxxx
192.127.133.52   某某业务备库  jeanron  Primary Linux   Oracle  N       xxxx
通过这个列表就可以开始分析了。脚本实现内容如下:
. ~/.bash_profile > /dev/null
BASEDIR="/home/hardcheck"
mkdir -p ${BASEDIR}/{tmplog,log} && cd ${BASEDIR}
DATE=`date +%Y%m%d%H%M`
LOG="hardcheck_${DATE}.log"
TMP_SCRIPT="hardcheck_${DATE}.sh"
 
exec 3>&1 4>&2 1>$LOG 2>&1
### 将服务器列表作为参数传递进来,为了考虑字符兼容性,统一采用utf8来处理
SERVERLIST=$1
if [ -z "${SERVERLIST}" ] || [ ! -s "${SERVERLIST}" ] ; then
cat /home/jeanron/alldbserver-linux.txt|iconv -f GBK -t UTF8|grep jeanron|grep -v Solaris|grep -v nopingdb|grep -v "#1"> db_list.all.lst
SERVERLIST=$BASEDIR/db_list.all.lst
fi

SSH="ssh -oConnectionAttempts=3 -oConnectTimeout=5 -oStrictHostKeyChecking=no"
echo "#start hardcheck"
### {{{ 以下为真正的hardcheck检查,远程调用
while read line
do
  tmp_host=`echo $line|egrep -iv '^$|^#|Solaris|AIX'`    --排除solaris,AIX的检测
  IP=`echo $tmp_host|awk '{print $1}'`
  DB=`echo $tmp_host|awk '{print $2}'`
  OWNER=`echo $tmp_host|awk '{print $3}'`
  STD_TYPE=`echo $tmp_host|awk '{print $4}'`
  DB_TYPE=`echo $tmp_host|awk '{print $6}'`
  ILO_INFO=`echo $tmp_host|awk '{print $8}'`
  echo "echo \"$IP;$DB;$OWNER;$STD_TYPE;$DB_TYPE;$ILO_INFO\"" >> $TMP_SCRIPT
  echo "${SSH} $IP \"/opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -a0|grep Error;/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL|grep Firmware|grep -v Level|grep -v Up|grep -v  Online \" " >>$TMP_SCRIPT
done < ${SERVERLIST}
### }}}

### {{{ 邮件报警
sh $TMP_SCRIPT |tee $LOG |grep -v "Error Count: 0"| grep -v \;\;\;\;\;> mail.txt

MAILTO="jeanron100@hotmail.com"
/bin/bash $BASEDIR/beautymail.sh   -t "DBIP;DB用途;负责人;主备库;数据库类型;ILO信息" -m ${MAILTO} -s "Disk Error Count Health Daily Check(${DATE})" ${BASEDIR}/mail.txt

里面有几个地方可以改进一下,对于命令的报告形式,发现还是有一个脚本非常不错,beautymail.sh
内容如下,对于格式美化还是非常给力的,我们只需要输入一个基本格式的数据,就会输出一个格式化后的结果内容,非常给力。
输出的结果类似下面的效果。

脚本内容如下,当然也是参考了很多的出处,我只是引用一下。
source /etc/profile > /dev/null
. ~/.bash_profile > /dev/null

title=''
topline=""
html='/tmp/info.html'
mail='jeanron100@hotmail.com'
subject='【报警输出优化】Test'

while getopts "a:T:t:H:m:s:h" Option
do
        case $Option in
                a) addfile="$OPTARG";;
                T) title="$OPTARG";;
                t) topline="$OPTARG";;
                H) html="$OPTARG";;
                m) mail="$OPTARG";;
                s) subject="$OPTARG";;
                h)
                        echo -e "beautymail V2.0 copyright To make your mail more human-readable\n\
Usage: beautymail [-a addfile] [-T title-in-mail] [-t topline] [-H html-location] [-m mail-addr] [-s subject] content-file\n\
Options:
-a:     设置邮件里加附件,addfile需要附件的绝对路径
-T:     设置邮件里表格上方的说明文字
-t:     设置表格中首行,即各列的含义,如-t \" 日志类型;日志量;文件数 \", 注意是用英文分号隔开的多列
-m:     指定收件人
-s:     邮件主题
"
                exit
        esac
done
shift $(($OPTIND - 1))

function init(){
        chars=$(echo $topline|wc -c)
        width=$(echo $chars*50|bc)
cat >$html<<EOF
<font color = green ><b>数据情况: ${title}</b></font>
</form>
<table width=$width border="1">
</table>
EOF
        topline=$(echo $topline |sed -e 's/^/<b>/' -e 's/;/<\/b>;<b>/g' -e 's/$/<\/b>/')
        write2table "$topline" yellow
}

function write2table() {
        sed -i '$i\<tr>\n<\/tr>' $html
#       line=$(echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}')
#       for colume in $line;do
    echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}'|while read colume
        do
                wcl=$(cat $html|wc -l)
                insert=$(echo ${wcl}-1|bc)
#                echo $insert $colume
#                echo
            if [ -n $2 ] ; then
              sed -i "$insert i\ <td bgColor=$2>$colume<\/td>" $html
            else
              sed -i "$insert i\ <td>$colume<\/td>" $html
            fi
        done
}

init
[ -z $1 ] && echo 'At least need a log file to mail' && exit 2
cp -p $1 $1.tmp
dos2unix $1.tmp # && sed -i -e 's/ /;/g' -e 's/\t/;/g' $1
#for i in $(cat $1);do
### 按行处理
cat $1.tmp |while read line
do
        write2table "$line"
done
rm -f ${1}.tmp

#发送带附件的HTML格式正文的函数 (对于非txt或者cvs格式的文件,例如excel的xls,需要单独修改Type:搜MIMEtype)
#$1: mail_from
#$2: mail_to
#$3: subject
#$4: content mimetype, such as "text/plain"
#$5: content
#$6: attach mimetype, such as "text/csv"
#$7: attach display name
#$8: attach file path
function SendMailMultiMediaAttach(){
    local MSG_FILE="/tmp/mail.tmp"
 
    sub=$(echo $3|iconv -f GB2312 -t UTF-8)
    echo "From: $1" > $MSG_FILE
    echo "To: $2" >> $MSG_FILE
    echo "Subject: $sub" >> $MSG_FILE
    echo "Mime-Version: 1.0" >> $MSG_FILE
    echo 'Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw"' >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
    echo "Content-Type: $4" >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "$5" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "" >> $MSG_FILE
    if [ ! -z $8 ];then
        echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
        echo "Content-Type: $6" >> $MSG_FILE
        echo "Content-Transfer-Encoding: base64" >> $MSG_FILE
        echo "Content-Disposition: attachement; filename=$7" >> $MSG_FILE
        echo "" >> $MSG_FILE
        echo "" >> $MSG_FILE
        /usr/bin/base64 $8 >> $MSG_FILE
    fi
 
    cat $MSG_FILE | /usr/lib/sendmail -t
}
 
##! @TODO: 发送邮件
##! @AUTHOR: http://neoremind.net/2011/02/linux_sendmail_attachment_mutt/
##! @VERSION: 1.0
##! @IN:
##! @OUT:
function sendMail()
{
        echo "Sending $subject mail from $from to $to"
 
        from="root@$(hostname)"
        to="$1"
        #subject="$2"
        subject="=?UTF-8?B?`echo -n $2|base64`?="
        content_type="text/html;charset=utf-8"
        MAIL_HTML="$3"
        body="$(cat $MAIL_HTML)"
        attach_type="text/csv"
        attach_path="$4"
        attach_name=$(echo "$attach_path"|awk -F'/' '{print $NF".txt"}')
        SendMailMultiMediaAttach "$from" "$to" "$subject" "$content_type" "$body" "$attach_type" "$attach_name" "$attach_path"
        echo "Send mail done."
}

echo $addfile
if [ -z "$addfile" ];then
        sendMail "$mail" "$subject" "$html"
else
        sendMail "$mail" "$subject" "$html" "$addfile"
fi
#mutt -e 'my_hdr Content-Type: text/html' "$mail" -s "$subject" < "$html";

时间: 2024-08-02 15:54:42

使用shell批量监控磁盘坏块(二)的相关文章

使用shell批量监控磁盘坏块(一)

硬件的监控其实还是蛮重要的,这个部分在嘉年华中也着重强调过,不过做起来确实还是有一些难度,我们也尝试了一些方法,最终准备两条腿走路,一边使用中控的方式来统一监控管理,同事考虑把硬件监控揉入zabbix的监控体系之中.今天来说使用统一监控的方式. 在强调硬件监控的重要性时,最好的说明方式就是用数据说话. 下面的是我在Oracle嘉年华分享中提到的一个部分,对于监控硬件监控还是很容易忽略的一个环节,但是又是最无奈的一个环节. 在各类故障之中,硬件故障占用了绝大部分的故障比例.当然这个数字也有一些针对

Linux/Unix shell 脚本监控磁盘可用空间

    Linux下监控磁盘的空闲空间的shell脚本,对于系统管理员或DBA来说,必不可少.下面是给出的一个监控磁盘空间空间shell脚本的样本,供大家参考.   1.监控磁盘的空闲空间shell脚本 robin@SZDB:~/dba_scripts/custom/bin> more ck_fs_space.sh #!/bin/bash # -----------------------------------------------------------------------------

SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)

原文:SQL Server自动化运维系列--监控磁盘剩余空间及SQL Server错误日志(Power Shell) 需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测.作为一个高效的DBA不可能每天都要上生产机上查看磁盘剩余或者直到磁盘无剩余空间报错后才采取扩容措施. 当然,作为微软的服务器有着自己的监控软件:SCCM(System Center

使用 DBMS_REPAIR 修复坏块

       对于Oracle数据块物理损坏的情形,在我们有备份的情况下可以直接使用备份来恢复.对于通过备份恢复,Oracel为我们提供了很多种方式,冷备,基于用户管理方式,RMAN方式等等.对于这几种方式我们需要实现基于数据库以及文件级别的恢复.RMAN同时也提供了基于块介质方式的恢复.也就是说我们根本不需要还原数据文件,而是直接从备份文件基于块来提取以实现联机恢复.可参考基于RMAN实现坏块介质恢复(blockrecover) .这是比较理想的情形.如果没有任何备份怎么办?我们可以使用Ora

Oracle坏块问题处理 Oracle坏块修复 Oracle坏块怎么办

Oracle数据库出现坏块现象是指:在Oracle数据库的一个或多个数据块(一个数据块的容量在创建数据库时由db_block_size参数指定,缺省为8K)内出现内容混乱的现象.由于正常的数据块都有固定的合法内容格式,坏块的出现,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错乃至挂起,并级联导致整个数据库实例出现异常. 一.坏块分类 物理坏块:也可以称为介质坏块,指的是块格式本身是坏的,块内的数据没有任何意义. 逻辑坏块:指的是块内的数据在逻辑是存在问题.比如说索引块的索引值没有按

基于RMAN实现坏块介质恢复(blockrecover)

      对于物理损坏的数据块,我们可以通过RMAN块介质恢复(BLOCK MEDIA RECOVERY)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据块.恢复整个数据库或数据文件那不是大炮用来打蚊子,有点不值得!但前提条件是你得有一个可用的RMAN备份存在,因此,无论何时备份就是一切.本文演示了产生坏块即使用RMAN实现坏块恢复的全过程.   1.创建演示环境 SQL> select * from v$version where rownum<2; BAN

用ORACLE8i修复数据库坏块的三种方法

oracle|数据|数据库 在进行SUN CLUSTER双机切换.意外断电或其它情况下,有时会发生共享盘MOUNT不上的情况,需要使用FSCK对共享盘进行修复.修复完成后,在数据库启动过程中,却又出现"数据块损坏,无法启动数据库"的现象,此时,可以根据不同的数据块损坏类型,检测并修复错误.在此介绍三种使用Oracle8i修复损坏数据块的方法. 一.数据块损坏,错误代码为ORA-01578 ORA-1115 I/O ERROR READING BLOCK 通常后跟ORA-737X错误与操

如何处理Oracle数据库中的坏块问题

oracle|数据|数据库|问题   本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了.   一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction laye

处理Oracle数据库中的坏块

一 什么是数据库的坏块 首先我们来大概看一下数据库块的格式和结构--数据库的数据块有固定的格式和结构,分三层 cache layer,transaction layer,data layer.在我们对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括 数据块的类型.数据块的地址信息.数据块的SCN号以及数据块的头部和尾部.如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了.数据库的坏块分为两种,逻辑坏块和物理坏块. 二 坏块对数据库产生的影响 如果数据库出