背景:最近工作中需要抽取一部分社会数据到数据库,但有时候方案或者程序报错导致数据未及时抽取到数据库,于是想到利用shell脚本通过定时任务来监控数据的及时性。
定义:将表中最大的抽取时间与当前时间进行比对,如果超过2两小时(代表2小时内都没新数据抽取入库)则判定为数据延迟,而这2小时表示我可以容忍的延迟范围
必要条件
shell连接oracle:安装oracle客户端工具oracle-instantclient-basic和oracle-instantclient-sqlplus
下载地址:
csdn付费地址(rpm形式,内部包含x86架构和arm架构):oracle-instantclient19.10-sqlplus-base-devel(x86arm架构)-Oracle文档类资源-CSDN下载linux连接oracle工具,适用于x86及arm架构oracle-instantclient-更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u010976445/85475478
官网下载地址Oracle Instant Client Downloadshttps://www.oracle.com/database/technologies/instant-client/downloads.html
?脚本内容
指定定时任务执行频率及告警日志
#===============参数区域=================
#监控周期(每天6点到22点每隔10分钟检测一次)
cronTab='*/10 6-22 * * *'
#指定告警信息文件(无需手动创建)
alarmInformationFile=/opt/soft/alarmInformation.txt
部分参数指定及识别
curTime:获取当前时间
monitorTime:可容忍的延迟时间(以下代码表示计算当前时间的2小时前的时间),即表示如果我数据库最新的时间是2.5小时前的,那就表示延迟,如果是1小时前的那再我可容忍的2小时内 表示没延迟
sqlStr:数据库连接字符串以及登录后执行的统计语句,此处包含一个EOF用法,不做过多解释
maxTime:数据库表最大的抽取时间,通过读取【sqlStr】执行结果解析得到
curPath:获取当前所在路径
curTime=`date +"%Y%m%d%H%M%S"`
monitorTime=`date -d "2 hour ago" +"%Y%m%d%H%M%S"`
sqlStr=`sqlplus -S test/test_123@192.168.195.13:1521/sndb <<EOF
select max(etltime) from T_LINKAGE_SEND ;
EOF`
maxTime=`echo ${sqlStr}|awk '{print $3}'`
curPath=$(cd `dirname $0`;pwd)
创建预警日志目录及文件
alarmInformationFileDir=`echo ${alarmInformationFile}|awk -F/ 'OFS="/"{$NF="";print}'`
mkdir -p ${alarmInformationFileDir}
touch ${alarmInformationFile}
判断数据是否延迟?
即判断数据库内最新的抽取时间是否超过设置的可容忍延迟时间,但最新时间大于可容忍延迟时间,
正常:如果最新抽取时间大于可容忍延迟时间,则输出抽取正常,并删除预警日志中相关的日志信息 异常:如果最新抽取时间小于可容忍延迟时间,这输出抽取异常,并删除预警日志中之前的日志,重新输入新的异常信息
if [ ${maxTime} -gt ${monitorTime} ];then
echo -e "当前检测时间:${curTime},抽取正常"
sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
else
echo -e "当前检测时间:${curTime},预警信息异常,最新抽取时间:${maxTime}"
sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
echo -e "monitorOracleStart\n当前检测时间:${curTime},抽取异常,最新推送时间:${maxTime}\nmonitorOracleEnd" >>${alarmInformationFile}
fi
添加到定时任务?
识别当前文件及路径,添加到定时任务中
curPath=$(cd `dirname $0`; pwd)
fileName=`echo "$0"|awk -F/ '{print $NF}'`
if [ -f "/var/spool/cron/root" ];then
? sed -i "/${fileName}/d" /var/spool/cron/root
? echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
? /sbin/service crond restart $1>/dev/null 2>&1
else
? touch /var/spool/cron/root
? sed -i "/${fileName}/d" /var/spool/cron/root
? echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
? /sbin/service crond restart $1>/dev/null 2>&1
fi
完整脚本
#! /bin/bash
#===============参数区域=================
#监控周期(每天6点到22点每隔10分钟检测一次)
cronTab='*/10 6-22 * * *'
#指定告警信息文件(无需手动创建)
alarmInformationFile=/opt/soft/alarmInformation.txt
#===============参数区域=================
#参数识别区域
curTime=`date +"%Y%m%d%H%M%S"`
monitorTime=`date -d "2 hour ago" +"%Y%m%d%H%M%S"`
sqlStr=`sqlplus -S test/test_123@192.168.195.13:1521/sndb <<EOF
select max(etltime) from T_LINKAGE_SEND ;
EOF`
maxTime=`echo ${sqlStr}|awk '{print $3}'`
curPath=$(cd `dirname $0`;pwd)
#创建预警日志目录及文件
alarmInformationFileDir=`echo ${alarmInformationFile}|awk -F/ 'OFS="/"{$NF="";print}'`
mkdir -p ${alarmInformationFileDir}
touch ${alarmInformationFile}
#开始判断最新推送时间是否与当前时间差距超过两小时
if [ ${maxTime} -gt ${monitorTime} ];then
echo -e "当前检测时间:${curTime},抽取正常"
sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
else
echo -e "当前检测时间:${curTime},预警信息异常,最新推送时间:${maxTime}"
sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
echo -e "monitorOracleStart\n当前检测时间:${curTime},抽取异常,最新抽取时间:${maxTime}\nmonitorOracleEnd" >>${alarmInformationFile}
fi
#添加到定时任务
curPath=$(cd `dirname $0`; pwd)
fileName=`echo "$0"|awk -F/ '{print $NF}'`
if [ -f "/var/spool/cron/root" ];then
sed -i "/${fileName}/d" /var/spool/cron/root
echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
/sbin/service crond restart $1>/dev/null 2>&1
else
touch /var/spool/cron/root
sed -i "/${fileName}/d" /var/spool/cron/root
echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
/sbin/service crond restart $1>/dev/null 2>&1
fi
|