Ckpyt,
ну не знаю, чего ты там наваял на полторы тысячи строк, но почти все подобные задачи решаются перловым скриптом на полторы сотни строк, 2/3 которых печать в лог-файл
Вот конкретный рабочий скрипт, который выполняет все нужные действия. Стопит оракловую базу, стопит сервисы, архивирует RAR все нужное содержимое, а потом все обратно стартут. Вешаешь все или на шедулер по команде
at или ставишь nncron. Все что надо, изредка посматривать в логи. Те папки которые нужно архивировать указываютсяв файле
backup.lst
Код:
#!/Perl/bin/perl
#
# Скрипт создания offline архивной копии базы Oracle Informatica
#
# Author: Merlin Cori
#
# merlin.cori@gmail.com
#
# Ключи запуска:
# - отсутствуют
#
use Mail::Sender;
use Cwd;
use Time::localtime;
use Win32API::File 0.08 qw( :ALL );
#
#--------------------------------Переменные --------------------
$archdir = "d:\\backup\\"; # Рабочий каталог
$arch_file = "archive_"; # Файл backupa
$ext=".rar";
$logfile = "oracle_backup.log"; # Лог файл
$command = "c:\\arc\\rar a -rr10p -k -m1 -mt4 -r -v3900m"; # командная строка запуска программы архивации
$startbat="startdb.bat";
$stopbat="stopdb.bat";
$dir_list=" \@backup.lst";
$mail_to = "merlin.cori@gmail.com";
$test_run=0;
#---------------------------------------------------------------------
print("\t- = - Informatica Oracle base backup script - = -\n\t\tVersion 0.3a build 15.06.2009\n\n");
$workdir = "c:\\oracle"; # Рабочий каталог
($day, $month, $year, $hour, $min, $sec)=now();
$file_name=$arch_file.$day."_".$month."_".$year;
open (LOGFILE_HANDLE,">>$logfile") or die ("Cannot open log file $logfile");
print LOGFILE_HANDLE "Started ";
print LOGFILE_HANDLE "$day.$month.$year $hour:$min:$sec";
print LOGFILE_HANDLE "\n";
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "$day.$month.$year - $hour:$min:$sec Stopping services\n";
print LOGFILE_HANDLE "Stopping Informatica PCISBW\n";
system("net stop \"Informatica PCISBW\"");
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Stopping Informatica Server\n";
system("net stop Informatica");
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Stopping Informatica Repository Server\n";
system("net stop \"Informatica Repository Server\"");
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Stopping Gene6 FTP Server\n";
system("net stop \"Gene6 FTP Server\"");
open(BATFILE_HANDLE,">$stopbat") or die ("Cannot create temp bat file");
print BATFILE_HANDLE "set nls_lang=russian_cis.ru8pc866\n";
print BATFILE_HANDLE "set ORACLE_SID=XXXX\n";
print BATFILE_HANDLE "echo set echo on > %0.tmp\n";
print BATFILE_HANDLE "echo connect sys/".$passwd."\@XXXX as sysdba; >> %0.tmp\n";
print BATFILE_HANDLE "echo shutdown immediate; >> %0.tmp\n";
print BATFILE_HANDLE "echo exit; >> %0.tmp\n";
print BATFILE_HANDLE "C:\\oracle\\XXXX\\ora92\\bin\\sqlplus /nolog @%0.tmp\n";
print BATFILE_HANDLE "del %0.tmp\n";
print BATFILE_HANDLE "exit\n";
close BATFILE_HANDLE;
system("stopdb.bat");
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Stopping OracleXXXXTNSListener\n";
system("net stop OracleXXXXTNSListener");
unlink $stopbat;
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Stopping OracleServiceXXXX\n";
system("net stop OracleServiceXXXX");
# Архивируем содержимое папки Oracle
$archive=$archdir.$file_name.$dir_list;
system "$command $archive.$dir_list";
$source=$archdir.$file_name.$ext;
$dest=$destdir.$file_name.$ext;
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "$day.$month.$year - $hour:$min:$sec Starting services\n";
print LOGFILE_HANDLE "Starting OracleServiceXXXX\n";
system("net start OracleServiceXXXX");
print LOGFILE_HANDLE "Starting OracleXXXXTNSListener\n";
system("net start OracleXXXXTNSListener");
print LOGFILE_HANDLE "Run start.bat\n";
open(BATFILE_HANDLE,">$startbat") or die ("Cannot create temp bat file");
print BATFILE_HANDLE "echo set echo on > %0.tmp\n";
print BATFILE_HANDLE "echo connect sys/".$passwd."\@XXXX as sysdba; >> %0.tmp\n";
print BATFILE_HANDLE "echo startup force; >> %0.tmp\n";
print BATFILE_HANDLE "echo exit; >> %0.tmp\n";
print BATFILE_HANDLE "C:\\oracle\\XXXX\\ora92\\bin\\sqlplus /nolog @%0.tmp\n";
print BATFILE_HANDLE "del %0.tmp\n";
close BATFILE_HANDLE;
system("startdb.bat");
unlink $startbat;
print LOGFILE_HANDLE "Starting Informatica Repository Server\n";
system("net start \"Informatica Repository Server\"");
print LOGFILE_HANDLE "Starting Informatica Server\n";
system("net start Informatica");
sleep 40;
print LOGFILE_HANDLE "Starting Informatica PCISBW\n";
system("net start \"Informatica PCISBW\"");
print LOGFILE_HANDLE "Starting Gene6 FTP Server\n";
system("net start \"Gene6 FTP Server\"");
}
($day, $month, $year, $hour, $min, $sec)=now();
print LOGFILE_HANDLE "Backup successful\n";
print LOGFILE_HANDLE "Stopped $day.$month.$year - $hour:$min:$sec \n\n";
print LOGFILE_HANDLE "-" x 40;
print LOGFILE_HANDLE "\n\n";
close LOGFILE_HANDLE;
send_message("Completed","Success XXXX",$mail_to);
#------------------------------- Begin send message -------------------------------------
sub send_message
{
my($message) = @_[0];
my($subj) = @_[1];
my($adress)= @_[2];
$sender = new Mail::Sender {
smtp => 'smtp.xxxxxx.ru',
from => 'backup@xxxxxx.ru',
on_errors => undef,
} or die "Can't create the Mail::Sender object: $Mail::Sender::Error\n";
$sender->OpenMultipart({to => $adress, subject => $subj});
$sender->Body({encoding => 'Base64', charset => 'windows-1251'});
$sender->SendEnc($message);
$sender->Close;
}
#------------------------------- End send message ---------------------------------------
#------------------------------- Begin current date and time ----------------------------------
sub now()
{
$day = localtime->mday();
$month = localtime->mon()+1;
$year=localtime->year() + 1900;
#final_archiving ($day, $month, $year, $archdir);
$hour=localtime->hour();
$min=localtime->min();
$sec=localtime->sec();
return $day, $month, $year, $hour, $min, $sec;
#------------------------------- End current date and time ------------------------------------
}