用Perl写Primary维护脚本
维护生产库上的归档日志都不是一件容易的事, 一方面要尽量保存可能多的归档日志, 另一方面又要确保归档日志空间足够, 给归档日志用的卷又不会是很大, 最关键的是你不能时时盯着卷的容量, 还要保证删除不出错. 这个工作其实是有如下几个需求:
1, 根据容量保存最新的日志, 如保存最新的200个归档. 2, 根据生成时间保存最新的日志, 如只删除一天以前产生的归档日志. 3, 只能删除已经在备库上应用过的归档日志, 以防止传输中出错, 最底要求是只能删除已经传送到一个或几个备库上的日志. 根据这三点要求来看, 你会发现目前没有好的现成的脚本来定期删除生产库上的归档日志, 所以我就自已写了一个, 可满足以上三个要求.
根据上一篇Standby的脚本, 很容易写一个脚本来获得备库上已经应用过的日志的Sequence号, 然后在删除主库归档日志文件的脚本中, 通过ssh来调用.
sub getSSHStandbyLog
{
my ($host,$sid) = @_;
my $logseq = "???";
eval {
local $SIG{ALRM} = sub { die "???\n" }; # NB: \n required
alarm 10;
$logseq = `ssh -n -a -q -o NumberOfPasswordPrompts=0 $host /home/oracle/admin/bin/getstandbylog.pl $sid`;
alarm 0;
};
$logseq = "???" if ($@ eq "???\n");
$logseq = "???" if (length($logseq) == 0);
chomp($logseq);
scalar $logseq;
}
然后到着查找到最小的归档日志, 再顺着删除, 就比较完全了. 昨天已经在一个库上用上了新脚本, 正在观察中.

