背景:最近工作中需要抽取一部分社会数据到数据库,但有时候方案或者程序报错导致数据未及时抽取到数据库,于是想到利用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
- #===============参数区域=================
- #监控周期(每天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