• shell连接Oracle 监控表数据实时性


    背景:最近工作中需要抽取一部分社会数据到数据库,但有时候方案或者程序报错导致数据未及时抽取到数据库,于是想到利用shell脚本通过定时任务来监控数据的及时性。

    定义:将表中最大的抽取时间与当前时间进行比对,如果超过2两小时(代表2小时内都没新数据抽取入库)则判定为数据延迟,而这2小时表示我可以容忍的延迟范围

    必要条件

    shell连接oracle:安装oracle客户端工具oracle-instantclient-basicoracle-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

     脚本内容

    指定定时任务执行频率及告警日志

    1. #===============参数区域=================
    2. #监控周期(每天6点到22点每隔10分钟检测一次)
    3. cronTab='*/10 6-22 * * *'
    4. #指定告警信息文件(无需手动创建)
    5. alarmInformationFile=/opt/soft/alarmInformation.txt

    部分参数指定及识别

    curTime:获取当前时间

    monitorTime:可容忍的延迟时间(以下代码表示计算当前时间的2小时前的时间),即表示如果我数据库最新的时间是2.5小时前的,那就表示延迟,如果是1小时前的那再我可容忍的2小时内 表示没延迟

    sqlStr:数据库连接字符串以及登录后执行的统计语句,此处包含一个EOF用法,不做过多解释

    maxTime:数据库表最大的抽取时间,通过读取【sqlStr】执行结果解析得到

    curPath:获取当前所在路径

    1. curTime=`date +"%Y%m%d%H%M%S"`
    2. monitorTime=`date -d "2 hour ago" +"%Y%m%d%H%M%S"`
    3. sqlStr=`sqlplus -S test/test_123@192.168.195.13:1521/sndb <<EOF
    4. select max(etltime) from T_LINKAGE_SEND ;
    5. EOF`
    6. maxTime=`echo ${sqlStr}|awk '{print $3}'`
    7. curPath=$(cd `dirname $0`;pwd)

    创建预警日志目录及文件

    1. alarmInformationFileDir=`echo ${alarmInformationFile}|awk -F/ 'OFS="/"{$NF="";print}'`
    2. mkdir -p ${alarmInformationFileDir}
    3. touch ${alarmInformationFile}

    判断数据是否延迟 

    即判断数据库内最新的抽取时间是否超过设置的可容忍延迟时间,但最新时间大于可容忍延迟时间,

    正常:如果最新抽取时间大于可容忍延迟时间,则输出抽取正常,并删除预警日志中相关的日志信息
    异常:如果最新抽取时间小于可容忍延迟时间,这输出抽取异常,并删除预警日志中之前的日志,重新输入新的异常信息

    1. if [ ${maxTime} -gt ${monitorTime} ];then
    2. echo -e "当前检测时间:${curTime},抽取正常"
    3. sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
    4. else
    5. echo -e "当前检测时间:${curTime},预警信息异常,最新抽取时间:${maxTime}"
    6. sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
    7. echo -e "monitorOracleStart\n当前检测时间:${curTime},抽取异常,最新推送时间:${maxTime}\nmonitorOracleEnd" >>${alarmInformationFile}
    8. fi

    添加到定时任务 

    识别当前文件及路径,添加到定时任务中

    1. curPath=$(cd `dirname $0`; pwd)
    2. fileName=`echo "$0"|awk -F/ '{print $NF}'`
    3. if [ -f "/var/spool/cron/root" ];then
    4.   sed -i "/${fileName}/d" /var/spool/cron/root
    5.   echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
    6.   /sbin/service crond restart $1>/dev/null 2>&1
    7. else
    8.   touch /var/spool/cron/root
    9.   sed -i "/${fileName}/d" /var/spool/cron/root
    10.   echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
    11.   /sbin/service crond restart $1>/dev/null 2>&1
    12. fi

    完整脚本

    1. #! /bin/bash
    2. #===============参数区域=================
    3. #监控周期(每天6点到22点每隔10分钟检测一次)
    4. cronTab='*/10 6-22 * * *'
    5. #指定告警信息文件(无需手动创建)
    6. alarmInformationFile=/opt/soft/alarmInformation.txt
    7. #===============参数区域=================
    8. #参数识别区域
    9. curTime=`date +"%Y%m%d%H%M%S"`
    10. monitorTime=`date -d "2 hour ago" +"%Y%m%d%H%M%S"`
    11. sqlStr=`sqlplus -S test/test_123@192.168.195.13:1521/sndb <<EOF
    12. select max(etltime) from T_LINKAGE_SEND ;
    13. EOF`
    14. maxTime=`echo ${sqlStr}|awk '{print $3}'`
    15. curPath=$(cd `dirname $0`;pwd)
    16. #创建预警日志目录及文件
    17. alarmInformationFileDir=`echo ${alarmInformationFile}|awk -F/ 'OFS="/"{$NF="";print}'`
    18. mkdir -p ${alarmInformationFileDir}
    19. touch ${alarmInformationFile}
    20. #开始判断最新推送时间是否与当前时间差距超过两小时
    21. if [ ${maxTime} -gt ${monitorTime} ];then
    22. echo -e "当前检测时间:${curTime},抽取正常"
    23. sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
    24. else
    25. echo -e "当前检测时间:${curTime},预警信息异常,最新推送时间:${maxTime}"
    26. sed -i '/^monitorOracleStart/,/^monitorOracleEnd/d' ${alarmInformationFile}
    27. echo -e "monitorOracleStart\n当前检测时间:${curTime},抽取异常,最新抽取时间:${maxTime}\nmonitorOracleEnd" >>${alarmInformationFile}
    28. fi
    29. #添加到定时任务
    30. curPath=$(cd `dirname $0`; pwd)
    31. fileName=`echo "$0"|awk -F/ '{print $NF}'`
    32. if [ -f "/var/spool/cron/root" ];then
    33. sed -i "/${fileName}/d" /var/spool/cron/root
    34. echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
    35. /sbin/service crond restart $1>/dev/null 2>&1
    36. else
    37. touch /var/spool/cron/root
    38. sed -i "/${fileName}/d" /var/spool/cron/root
    39. echo "${cronTab} sh ${curPath}/${fileName}" >> /var/spool/cron/root
    40. /sbin/service crond restart $1>/dev/null 2>&1
    41. fi

  • 相关阅读:
    WPF 值转换
    VBA调用宏的方式总结大全
    MYSQL--事务
    lv3 嵌入式开发-5 linux shell命令(进程管理、用户管理)
    中文小样本NER模型方法总结和实战
    C++中的函数
    基于风险的漏洞管理实现高效安全
    TODO Vue typescript forEach的bug,需要再核實
    计算机网络学习笔记(Ⅰ):计算机网络体系结构
    vue拖拉拽生成表单
  • 原文地址:https://blog.csdn.net/u010976445/article/details/125542105