Perl是一门非常适合用来写数据库管理脚本的语言, Shell当然也很强, 但在这个领域还是没有Perl好. 来讲一个最简单的需求, 需要取得Standby或Dataguard上最后一个应用的归档日志, 在普通恢复和Managed恢复方式都要支持, 这个需求并不容易准确地实现. 如果用Perl来分析Oracle的alert日志文件, 则比较容易. 如下所示:

sub getLastRecoveredLog
{
    my ($alert_log_file) = @_;
    my $logseq = “???”;
    my $lastline = `tail -1000 ${alert_log_file} | grep “Media Recovery Log” | tail -1`;
    if (defined($lastline))
    {
        $lastline =~ s/.*\///g;
        my @cols = ($lastline =~ /\w+_\d?_(\d+)[\.|_]/);
        if (defined($cols[0]))
        {
            $logseq = $cols[0];
            $logseq = $logseq – 1;
        }
    }
    scalar $logseq;
}

    如要删除已经应用过的归档日志, 那么只需要再写一个根据Sequence查找归档日志位置的函数就行了.

sub findLogBySequence
{
    my ($logseq) = @_;
    my $logfile = `find /data*/arch -follow -name *_${logseq}.* | head -1`;
    chomp($logfile);
    # Foloowing logic is for Oracle 10g
    if (length($logfile) == 0)
    {
      $logfile = `find /data*/arch -follow -name *_${logseq}_* | head -1`;
      chomp($logfile);
    }

    scalar $logfile;
}

    先找出所有要删除的归档日志, 存在变量中, 然后根据Sequence从小删到大就行了.