Oracle - 截取指定日期的alert log

工作中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
    check_date $1
    get_begin_time $1
    get_end_time $1
elif [ $cnt -eq 2 ]; then
    check_date $1
    check_date $2
    get_begin_time $1
    get_end_time $2
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.$1.log
    echo "alert_$ORACLE_SID.$1.log has created!"
elif [ $cnt == 2 ]; then
    sed -n "${row1},${row2}p" $dir/alert_$ORACLE_SID.log > ./alert_$ORACLE_SID.$1_to_$2.log
    echo "alert_$ORACLE_SID.$1_to_$2.log has created!"
fi
exit 0

使用说明:

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日志中存在才会有新文件生成,否则会报错

原文地址:https://www.cnblogs.com/ddzj01/p/10851969.html

时间: 2024-11-19 23:19:07

Oracle - 截取指定日期的alert log的相关文章

指定日期查询数Oracle据库

1,首先,介绍一下to_char函数 TO_CHAR 是把日期或数字转换为字符串,不能指定字符串长度. 使用TO_CHAR函数处理日期: TO_CHAR(number, '格式')  例如:TO_CHAR(salary,'$99,999.99') 使用TO_CHAR函数处理日期: TO_CHAR(date,'格式'); TO_CHAR(newdate,'yyyy-mm-dd')  --将指定日期转换为年-月-日 TO_CHAR(newdate,'yyyy-mm-dd hh24:mi:sssss'

oracle中从指定日期中获取月份或者部分数据

从指定日期中获取部分数据: 如月份: select to_CHAR(sysdate,'MM') FROM DUAL; 或者: select extract(month from sysdate) from dual; 又或者最笨的方法.用to_char()先把日期转化为指定格式的字符串,在通过substr()这个取到想要的数据. select substr(to_char(sysdate,'yyyy-mm-dd'),6,2) from dual; 获取日期其他部分数据和上方法一样.

截取指定长度字节数后的字符串(Java方法实例,注:同样思路js也适用)

可能之前是习惯了上网查看其他人的资料,当我遇到这样的问题的时候,我第一时间想到的就是上网查个现成的方法直接用:可是查阅网上各大论坛以及其他资料之后,发现大部分人都是照搬其他人的,这种情况很严重,而且个人感觉很不利于个人技术的成长:当然更重要的原因是,我感觉网上的大部分方法都把问题给复杂化了,无论是用js方法截取还是通过封装Java类,都感觉繁琐了些:为此我自己写了个相对来说较为简单的方法,其实很简单的思路和方法就能实现,下面奉上我自己的方法,希望大家多多指正不足之处(支持全角输入的字符和汉字等,

JS计算指定日期是距今的第几周,星期几

无意中在百度知道上发现这样一个问题,就抽时间见写了一个函数. 首先我们需要明确,既然是指定日期距今的第几周,那么就要知道指定的日期是什么,而且是不能确定的,会根据使用者不同而得到不同的日期,所以我们需要将这个日期设置为参数,由使用者决定. 下面我们一起来看一下这段代码: 1 (function(){ 2 /* 3 * 说明: 4 * 一周的起始计算方式不同国家有所不同,很多其他国家将周日作为一周的开始 5 * 本代码使用中国习惯,将周一作为每周的开始 6 * 特此说明 7 */ 8 9 func

sql中从指定位置截取指定长度字符串

1. 字符串函数应用 --从指定索引截取指定长度的字符串 SELECT substring('abcdefg',2,5) --获取字符串中指定字符的索引(从1开始) select charindex(',','ab,cdefg') --实际应用中的语句 select proId,color,substring(FacePath,0,charindex(',',FacePath)) as FacePath from proselect where id=1000000 2. 日期函数应用 --获取

JS 比较日期相隔都少天&amp;&amp; 比较两个日期大小&amp;&amp;指定日期往前后推指定天数

//这些天常接触到有关于js操作日期事 就小结了一下,希望对你有帮助 function conversionDate(a,b){ var start =a.split('-'); var end = b.split('-'); //转换为date对象 var strDateS = new Date(start[0], start[1], start[2]); var strDateE = new Date(end[0], end[1], end[2]); var differ=parseInt(

Active Session History (ASH) Performed An Emergency Flush Messages In The Alert Log

Active Session History (ASH) Performed An Emergency Flush Messages In The Alert Log (文档 ID 1385872.1)   In this Document   Symptoms   Cause   Solution This document is being delivered to you via Oracle Support's Rapid Visibility (RaV) process and the

ORACLE函数之日期时间转换函数

 1.          TO_CHAR 语法:TO_CHAR(X [,format]) 说明:将X按format格式转换成字符串.X是一个日期或者数字,format是一个规定了X采用何种格式转换的格式字符串 举例: SQL>SELECT TO_CHAR(sysdate,'YYYY-MM-DD hh24:mi:ss') A FROM DUAL; A ------------------- 2014-06-1815:58:43 2.            TO_DATE 语法:TO_DATE(

js日期计算及快速获取周、月、季度起止日,获取指定日期周数以及星期几的小例子

JS获取日期时遇到如下需求,根据某年某周获取一周的日期.如开始日期规定为星期四到下一周的星期五为一周. 格式化日期: function getNowFormatDate(theDate) { var day = theDate; var Year = 0; var Month = 0; var Day = 0; var CurrentDate = ""; // 初始化时间 Year= day.getFullYear();// ie火狐下都可以 Month= day.getMonth()