您的位置:首页 > 数据库 > Oracle

oracle 告警日志(alert log)按日期查看

2015-06-10 00:00 344 查看
摘要: 做数据库运维,需要经常有查看oracle后台日志(alert log)来发现数据库是否存在问题,通常可以使用tail -100之类的方式来查看,但是经常是不是查多了,就是查少了;为了能够方便的按日期一范围来查看日志,因此有了这个脚本“get_alert”适用于linux/unix下的oracle数据库。

#!/usr/bin/perl
use Time::Local;

$alert_sql="select d.value||'/alert_'|| e.instance_name||'.log' background_dump_dest
from v\\\$parameter d,v\\\$instance e
where d.name='background_dump_dest'
and rownum<2;";
$ver_sql="select substr(version,1,4) version from v\\\$instance;";

$ALERT_FILE=exec_sql($alert_sql);
$DB_VERSION=exec_sql($ver_sql);

check_main();
sub help()
{
print "usage:\n";
print "get_alert 0                       --get today\'s alert log.\n";
print "get_alert 2                       --get alert log from 2 days ago to now.\n";
print "get_alert 2010-09-01              --get alert log from 2010-09-01 to now.\n";
print "get_alert 2010-09-01 2010-10-01   --get alert log between 2010-09-01 and 2010-10-01.\n";
exit 1;
}

sub get_date
{
($p1)=@_;
@ds_array=split(/-/,$p1);
$seconds=0;
if(@ds_array==1)
{
$seconds=(time() - 86400*$p1);
}
else
{
$seconds = timelocal(0,0,0,$ds_array[2],$ds_array[1]-1,$ds_array[0]-1900);
}
return $seconds;
}

sub check_main()
{
if(@ARGV<1)
{
help();
}
$start_row=get_rownum(get_date($ARGV[0]));
$end_row=`sed -n '\$=' "$ALERT_FILE";`;
if(@ARGV>=2)
{
$end_row=get_rownum(get_date($ARGV[1]))-1;
}
chomp $end_row;
if($start_row>0 && $end_row>$start_row)
{
print `sed -n "$start_row,${end_row}p" $ALERT_FILE ;`;
}
}

sub get_rownum
{
$ds=scalar localtime($_[0]);
($p1,$p2)=(substr($ds,0,10),substr($ds,20,24));
##
if(substr($p1,8,1) ==" " && $DB_VERSION =="11.2")
{
substr($p1,8,1,"0");
}
print "$p1 $p2 \n";
##
$rownum=`egrep -n -i "$p1" $ALERT_FILE | grep "$p2" | head -1; `;
@rs=split(/:/,$rownum);
return $rs[0];
}

sub exec_sql
{
($p1)=@_;
$res=`
sqlplus -s / as sysdba <<EOF
set head off
set pagesize 0
set echo off
$p1
exit;
EOF
`;

$/="";
chomp($res);
return $res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: