zoukankan      html  css  js  c++  java
  • Oracle

    工作中DBA经常会查看alert log来检查数据库后台都记录了些什么日志,如果只想看某一天或者某段时间范围的日志,能够把这些日志从大的alert log中截取下来放到一个单独的文件中,对于查看和下载都是很有意义的事,接下来附上脚本

    script.sh

    #!/bin/bash
    ################################################################################
    # this script is to get the specified date log of oracle database alert log.   #
    # author: yangbao                                                              #
    # usage: ./script.sh 2019-5-1 --> get the log on 2019-5-1                      #
    # ./script.sh 2019-5-1 2019-5-3 --> get the log between 2019-5-1 and 2019-5-3  #
    ################################################################################
    
    # 判断日期格式是否有效
    check_date() {
        date -d "$1" &> /dev/null
        flag=$?
        if [ $flag -eq 1 ]; then
           echo "date is incorrect, please input the correct date formate like 2019-5-1."
           exit 1
        fi    
    }
    
    # 得到开始和结束的日期的指定格式
    get_begin_time() {
        year1=`date -d "$1" +%Y`
        month1=`date -d "$1" +%b`
        day1=`date -d "$1" +%d`
        week1=`date -d "$1" +%a`
    }
    
    get_end_time() {
        year2=`date -d "$1" +%Y`
        month2=`date -d "$1" +%b`
        day2=`date -d "$1" +%d`
        week2=`date -d "$1" +%a`
    }
    
    # 判断输入的参数个数是否正确
    cnt=$#
    if [ $cnt -eq 0 ]; then
        echo "you must input at least one date, formate like 2019-5-1."
        exit 1
    elif [ $cnt -eq 1 ]; then
        var1=$1
        check_date $var1
        get_begin_time $var1
        get_end_time $var1   
    elif [ $cnt -eq 2 ]; then
        var1=$1
        var2=$2
        check_date $var1
        check_date $var2
        t1=`date -d "$var1" +%s`
        t2=`date -d "$var2" +%s`
        if [ $t1 -gt $t2 ]; then
            temp=$var1
            var1=$var2
            var2=$temp
        fi
        get_begin_time $var1
        get_end_time $var2   
    elif [ $cnt -gt 2 ]; then
        echo "you input too much arguments, at most two arguments allowed." 
        exit 1
    fi
    
    # 查找alert日志所在的路径
    sqlplus -s /nolog &> /dev/null << eof
    set feedback off heading off verify off trimspool on timing off
    set pagesize 0 linesize 300
    conn / as sysdba;
    spool /tmp/tmpdir.txt
    select value from v$parameter where name='background_dump_dest'; 
    spool off
    exit;
    eof
    
    errs=`grep 'ERROR' /tmp/tmpdir.txt | wc -l`
    if [ $errs -gt 0 ]; then
        echo "query alert log direction run error, please check the /tmp/tmpdir.txt for details."
        exit 1
    else
        dir=`cat /tmp/tmpdir.txt`
    fi
    
    # 得到日志开始和结束的行数
    row1=`find $dir/alert_$ORACLE_SID.log | xargs grep -n "$week1 $month1 $day1" | grep "$year1" | head -n 1 | cut -d ":" -f 1`
    if [ "$row1" == "" ]; then
        echo "$1 is not found in alert log"
        exit 1
    fi
    
    row2=`find $dir/alert_$ORACLE_SID.log | xargs grep -n "$week2 $month2 $day2" | grep "$year2" | tail -n 1 | cut -d ":" -f 1`
    if [ "$row2" == "" ]; then
        echo "$2 is not found in alert log"
        exit 1
    fi
    row2=$(($row2+10))
    
    # 截取日志
    if [ $cnt == 1 ]; then
        sed -n "${row1},${row2}p" $dir/alert_$ORACLE_SID.log > ./alert_$ORACLE_SID.$var1.log
        echo "alert_$ORACLE_SID.$var1.log has created!"
    elif [ $cnt == 2 ]; then
        sed -n "${row1},${row2}p" $dir/alert_$ORACLE_SID.log > ./alert_$ORACLE_SID."$var1"_to_"$var2".log
        echo "alert_$ORACLE_SID."$var1"_to_"$var2".log has created!"    
    fi
    exit 0
    View Code

    使用说明:

    1.使用oracle用户执行,脚本会自动寻找alert日志的位置

    2.如果只查一天的日志,如2019-5-1这天的日志,则使用./script.sh 2019-5-1

    3.如果查一段时间范围的日志,如2019-5-1到2019-5-10这10天的日志,则使用./script.sh 2019-5-1 2019-5-10

    4.执行完成之后会在当前目录生成一个新文件

    5.输入的日期必须在alert日志中存在才会有新文件生成,否则会报错

  • 相关阅读:
    MySQL常用维护管理工具 枫
    sql触发器 枫
    MySQL函数大全 枫
    使用Cscope阅读Linux源码 枫
    ASP.NET文件下载,直接向客户端输出文件 枫
    网站设计数据库集群和数据库垂直分割,水平分割,库表散列 枫
    西点成品分类 枫
    asp函数列表 枫
    [笔记]一道C语言面试题:实现 itoa() 函数
    [笔记]Arduino平台使用US100超声波测距模块的电平模式测距实验
  • 原文地址:https://www.cnblogs.com/ddzj01/p/10851969.html
Copyright © 2011-2022 走看看