WEB开发网
开发学院数据库Oracle 使用shell处理oracle数据库alert日志 阅读

使用shell处理oracle数据库alert日志

 2008-10-16 12:56:17 来源:WEB开发网   
核心提示:1. 背景概述对于日常的一些重复性的操作,以及在用户现场进行问题处理的过程中,使用shell处理oracle数据库alert日志,采用一些自动化的脚本,来完成一些工作,调用600错误的处理脚本if [ $(awk '/ORA-00600/{print NR}' tmp_alert.tmp|wc -l|a

1. 背景概述

对于日常的一些重复性的操作,以及在用户现场进行问题处理的过程中,采用一些自动化的脚本,来完成一些工作,会使一些枯燥的工作变得简单、快速,同时也不容易出错。在为某些省份联通公司和财政厅实施服务的过程中,了解到用户有如下的需求:提供shell脚本,实现对oracle数据库的alert日志进行跟踪处理,比如根据时间(天为单位),来查看和处理alert日志。

在未编写脚本时,常用的处理方法是,下载alert文件,使用文本编辑工具查找,统计,定位,过滤,下载跟踪文件。一般比较费时,而且可能会有遗漏。

本文首先阐述算法,接着给出实现代码与样例,最后给出展望,脚本主要包括shell脚本以及sql脚本。

2. 算法

使用shell处理oracle数据库alert日志

?                         图1 流程图

确定需要分析多少天以来的日志情况

? 对时间进行处理,根据时间戳格式(本文处理的alert文件的时间格式类似于:Fri Aug 1 13:22:37 2008),获取起始行号,分析从起始行号到结束的所有内容。

? 过滤所有的ORA-信息,并对他们进行统计显示。

? 对关键的错误信息(ORA-00600,ORA-000060,ORA-1555,ORA-07445),进行单独处理。

? 查找并获取跟踪文件。生成ftp的格式,使用ftp命令下载跟踪文件。

? 使用操作系统命令,获取错误对应的含义。

3. Shell代码

处理alert文件的调用脚本check_alert.sh

#!/bin/sh
#设置alert日志文件的环境变量
ORIGINAL_ALERT="/arraybill/home/oracle/app/oracle/admin/hnbill/bdump/alert_hnbill.log"
#判断输入的参数:天
if [ $# -ne 1 ]
then
echo "参数不对,用法: sh check_alert.sh 3"
exit 1
fi
if [ $1 -lt 0 ]
then
echo "对不起,请输入一个非负整数"
exit 1
fi
#查询参数对应时间以前的系统时间
sh dated_alert.sh $1 >/dev/null
#分解时间格式,注意,其中天可能是一位,也可能是两位,月份是3位,月份与天组成的字符串长度固定
str_day=$(sed 1d tmp_date.log|awk '{if(substr($1,1,1) == 0) print substr($1,2,1);else print substr($1,1,2) }')
str_length=$(echo $str_day|awk '{print length($1)}')
#将三个字母表示的月份分解成首字母大写,其他小写
str_month=$(sed 1d tmp_date.log|awk '{print substr($1,4,3)}'|sed '1,$y/[JFMASODN]ABCDEFGHIJKLMNOPQRSTUVWXYZ/[JFMASODN]abcdefghijklmnopqrstuvwxyz/')
if [ $str_length -eq 1 ]
then
echo "awk '/""$str_month $str_day""/{print NR}' "$ORIGINAL_ALERT"" >tmp.sh
#echo "$str_month $str_day"
fi
if [ $str_length -eq 2 ]
then
echo "awk '/""$str_month $str_day""/{print NR}' "$ORIGINAL_ALERT"" >tmp.sh
#echo "$str_month $str_day"
fi
chmod 777 tmp.sh
chmod 777 tmp.sh
sh tmp.sh |awk 'NR==1{print $1}' >rownum.lst
#获取要处理的alert日志的开始行号和结束行号
alert_row_begin=$(cat rownum.lst |awk '{print $1}')
alert_row_end=$(wc -l $ORIGINAL_ALERT|awk '{print $1}')
echo "awk 'NR==$alert_row_begin,NR==$alert_row_end{print $0}' "$ORIGINAL_ALERT"" >tmp.sh
#根据行号范围,截取alert日志内容,并保存到临时文件tmp_alert.tmp中
sh tmp.sh >tmp_alert.tmp
echo
echo "-----------------------------------------------"
echo "错误汇总 开始时间:$begin_date_time"
echo "-----------------------------------------------"
echo
echo "数量 错误号"
echo "---- -------------------"
grep ORA- tmp_alert.tmp |awk '{print substr($0,0,9)}'|sort -nr| uniq -c|sort -nr
#如果有600错误,调用600错误的处理脚本
if [ $(awk '/ORA-00600/{print NR}' tmp_alert.tmp|wc -l|awk '{print $1}') -gt 0 ]
then
sh check_00600.sh
fi
#如果有07445错误,调用07445错误的处理脚本
if [ $(awk '/ORA-07445/{print NR}' tmp_alert.tmp|wc -l|awk '{print $1}') -gt 0 ]
then
sh check_07445.sh
fi
#如果有 000060 错误,调用000060错误的处理脚本
if [ $(awk '/ORA-000060/{print NR}' tmp_alert.tmp|wc -l|awk '{print $1}') -gt 0 ]
then
sh check_000060.sh
fi
#如果有 01555 错误,调用01555错误的处理脚本
if [ $(awk '/ORA-01555/{print NR}' tmp_alert.tmp|wc -l|awk '{print $1}') -gt 0 ]
then
sh check_01555.sh
fi
echo
#删除调用过程中产生的临时文件
rm -f tmp_3_line.sh
rm -f tmp_date.log
rm -f tmp.sh
rm -f ora01555_trc.log
rm -f ora006000_trc.log
rm -f ora07445_trc.log
rm -f ora000060_trc.log
rm -f trc_tmp
rm -f tmp_alert.tmp
rm -f ora006000_rownum.log
rm -f rownum.lst

1 2 3  下一页

Tags:使用 shell 处理

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接