« 用Perl写Standby维护脚本 »
DBA » http://www.anysql.net/dba/perl_purge_standby_archivelog.html 2008-11-15Perl是一门非常适合用来写数据库管理脚本的语言, 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从小删到大就行了.
Tags: Archive, Data Guard, DBA, Perl, Standby


b不错