#!/usr/local/bin/perl # StandBy manager unless ($dbautil::debug) { # Цель: # 1. Распределить во времени передачу архив логов # на backup server # 2. Обеспечить автоматическое вкачивание логов # На backup server' # # Алгоритм # Выполняется из cron под пользователем bkp # каждый час если со времени создания последнего архивлога # прошло более получаса создает архивлог # сверяет архивлоги у себя и на backup server # отправляет все отсутствующие архивлоги на backup server use lib qw(/export/home/demiurg/dvp/backup/lib); use strict; use File::Basename; use Time::localtime; use dbautil; #--------------------------------------------------------------------------- #my %para=(); #my @res = (); my $il=0; my $ir=0; my $ret=0; my @locallist = (); my @remotelist = (); my ($dir); my $latest_log; #daily procedure body sub FindMissingArchLog { my $found = 0; $dir = $dbautil::p->{standby}->{log_arch_dest}; if ( ! -e $dir ) { print "Directory not exist:".$dir.":\n"; exit (1); } chomp (@locallist = sort `$dbautil::p->{standby}->{llist}` ); chomp (@remotelist = sort `$dbautil::p->{standby}->{rlist}` ); # unless ($dbautil::debug) { # print @locallist; # print @remotelist; # } # Copy all new file while ( defined $locallist[$il] && defined $remotelist[$ir] ) { if ( $locallist[$il] eq $remotelist[$ir] ) { $ir++; $il++; } elsif ( $locallist[$il] lt $remotelist[$ir] ) { cp ($dbautil::p->{'standby'}->{'cp'}, $dir."/".basename($locallist[$il]),basename($locallist[$il])); $found = 1; $il++; } else { $ir++; } } while ( defined $locallist[$il] ) { cp ($dbautil::p->{'standby'}->{'cp'}, $dir."/".basename($locallist[$il]), basename($locallist[$il])); $found = 1; $il++; } $latest_log = basename($locallist[$il-1]); return ($found) } #-------------------------------------------------------------------------- # Run svrmgrl and applay all arrchive logs sub LoadArchLog{ my ($retval, $output, $cmd, $ok_str); print $dbautil::p->{standby}->{recovery}; $cmd = $dbautil::p->{standby}->{recovery}; $ok_str = "archive:".$latest_log.":"; ($retval, $output ) = &RunCmd ($cmd, $ok_str); # unless ($dbautil::debug) { print $ok_str; print $retval; } # if not OK if ( $retval ) { h_send_mail ({ 'From' => 'snn', 'To' =>$dbautil::p->{'dba_mail'} , 'Subject'=> $dbautil::p->{'standby'}->{'standby_failed'} }, $ok_str.$output); } } #--------------------------------------------------------------------------- # Main body here # ReadConfigFile ($ARGV[0]); $ret = &FindMissingArchLog(); # if ( $ret ) { # LoadArchLog; # }