#!/usr/bin/perl # ------------------------------------------------------------------------ # hotrest -- restore from hotarch # G. Patterson, Nov 2001 # Set the common parameters (contained in common.pl) use File::Basename; $MyPath = dirname($0); require "$MyPath\\common.pl"; use Time::Local; # ------------------------------------------------------------------------ sub LogMsg{ my @t = localtime(time); printf LOG "%04d-%02d-%02d %02d:%02d %s\n", $t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$_[0]; } # ------------------------------------------------------------------------ sub problem{ # Err Houston? ... Houston ... We have a problem ... LogMsg "ERROR: $_[0]"; die "$_[0]\n"; } # ------------------------------------------------------------------------ sub check_database_down{ # database must be DOWN! # my $sqltmp = "$tmpdir\\check_database_down.sql"; open SQL,">$sqltmp" || die "cannot open $sqltmp\n"; print SQL "connect $userid/$passwd\@$orasid\nexit\n"; my @t = `svrmgrl \@$sqltmp`; unlink $sqltmp; problem "Cannot $MyName a running database. Shut It Down First!" unless grep (/ORA-01034:/,@t); } # ------------------------------------------------------------------------ sub get_oraparm{ # retrieve parameter values from arcdir\\0header open (HDR,"$arcdir\\0header") || die "Cannot open $arcdir\\0header\n"; while (){ s/\s+$//; s/^\s+//; if (/\w+ started at /){ $start_str = $'; @start = split(' ',$start_str); @start = reverse (split( /-/,$start[0]), split(/:/,$start[1])); $start[4]--; $start[5] -= 1900; } elsif (/(\w+) FILES:$/){ $get_data = lc($1) . "_files"; } elsif (/^$/){ undef($get_data); } elsif (/^(.+): /){ $oraparm{$1} = $'; } elsif ($get_data){ push(@$get_data,$_); } else{ print "$_"; problem "problem with 0header"; } } } # ------------------------------------------------------------------------ # Main ... start here: $MyName = basename $0,"\.pl"; die "usage: $MyName sys_passwd db_name\n" unless (@ARGV == 2); $userid = "sys"; $passwd = $ARGV[0]; $orasid = $ARGV[1]; @start = localtime(time); $start_str = sprintf "%04d-%02d-%02d %02d:%02d:%02d",$start[5]+1900, $start[4]+1,$start[3],$start[2],$start[1],$start[0]; $logfile = sprintf "%s\\%s_%s_%02d%02d%02d.log",$logdir,$orasid,$MyName, $start[5]%100,$start[4]+1,$start[3]; open(LOG,">>$logfile") || die "error opening $logfile\n"; check_database_down(); $arcdir = "$arcdir\\$orasid"; get_oraparm(); problem "$oraparm{ORACLE_SID} does not match $orasid" unless (uc($oraparm{ORACLE_SID}) eq uc($orasid)); LogMsg "commencing hotrest"; print "overwriting control files\n"; unlink "$arcdir\\$MyName.tmp.zip"; foreach $x (@ctrl_files){ $p = dirname( $x); chdir $p || die "cannot chdir to $p"; $b = basename( $x); system "$zipadd $arcdir\\$MyName.tmp $b"; $cmd = "copy $arcdir\\" . uc($orasid) . "_CTRL.FILE $x"; system "$cmd"; } print "overwriting datafiles -- it is too late to change your mind\n"; foreach $x (@data_files){ ($n,$blks,$junk) = split(' ', $x); $p = dirname( $n); chdir $p || die "cannot chdir to $p"; $b = basename( $n); LogMsg "unzipping $b ..."; system "$unzip $arcdir\\$b"; $size = ( -s $n); problem "datafile size" unless ( $size == $blks * $oraparm{BLOCK_SIZE}) } print "moving existing logs to $arcdir\\$MyName.tmp\n"; $p = dirname( $log_files[0]); chdir $p || die "cannot chdir to $p"; $cmd = "$zipmv $arcdir\\$MyName.tmp " . uc($orasid) . '*'; system "$cmd"; print "restoring log files\n"; system "$unzip $arcdir\\archivelog"; print "$MyName complete -- media recovery required\n"; LogMsg "$MyName completed normal";