среда, 18 февраля 2015 г.

Скрипт для бэкапа

#!/usr/bin/perl -w
$ENV{"ORACLE_BASE"}='/opt/oracle';
$ENV{"ORACLE_HOME"}='/opt/oracle/product/11.2';
$ENV{"PATH"}="$ENV{ORACLE_HOME}/bin:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:$ENV{PATH}:.";
$ENV{"LD_LIBRARY_PATH"}="$ENV{'LD_LIBRARY_PATH'}:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:/lib:/usr/lib";
$ENV{"CLASSPATH"}="$ENV{ORACLE_HOME}/JRE:$ENV{ORACLE_HOME}/jlib:$ENV{ORACLE_HOME}/rdbms/jlib";
my $RMANCMD='rman target /';
my $ARCH_RMAN = <<'EOF';
backup  archivelog all delete all input;
exit;
EOF

my $INCR0_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 0 database;
backup  archivelog all delete all input;
crosscheck archivelog all;
crosscheck backup;
delete noprompt obsolete ;
exit
EOF
my $INCR1_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 database;
backup  archivelog all delete all input;
exit
EOF
my $CUM_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 CUMULATIVE database;
backup  archivelog all delete all input;
exit
EOF
my @SID=`lsnrctl status | grep Instance | awk '{print \$2}' | sort | uniq`;
my $sql_rman=q(select 'CNT='||count(1) from V\$RMAN_STATUS WHERE STATUS like 'RUNNING%';);
my $sql_db=q(select 'NAME='||name from V\$DATABASE;);
my $sql_incr0=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0  AND completion_time>=TRUNC(SYSDATE, 'month'););
my $sql_incr00=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0 AND completion_time>=TRUNC(CURRENT_DATE););
my $sql_incr1=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 1 AND completion_time>=TRUNC(CURRENT_DATE););
foreach my $sid (@SID)
{
    next if ($sid=~/ASM/);
    chomp($sid);
    $sid=~s/\"|\"|,//g;
    print $sid,"\n";
    ### check db name
    $ENV{ORACLE_SID}=$sid;
    `echo "$sql_db" | sqlplus / as sysdba`=~/NAME=(\w.+)/;
    print $1,"\n";
   
    ####check current backup job
    `echo "$sql_rman" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    if ($1 > 0 ) {
exit;
    }
    ####check increment 0 backup exists
    `echo "$sql_incr0" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    ### if incr0 is absent
    if ($1 == 0) {
       rman_job($INCR0_RMAN);
next;
    }
   
    ####check scheduler
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    ###every sunday
    if ($wday == 0 && $hour>4 && $mday<=7) {
    ####check increment 0 backup today exists
    `echo "$sql_incr00" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR0_RMAN);
   next;  
}
    }
    elsif ($wday == 0 && $hour>4){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($CUM_RMAN);
   next;  
}
    }
    elsif ($wday>0  && $hour>4 ){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR1_RMAN);
   next;  
}
    }
   
    if ( ( $hour % 3 ) == 0){
rman_job($ARCH_RMAN);
    }
   
}
sub rman_job {
my $scr=shift;
   open(CMD,"| $RMANCMD");
   print CMD $scr;
   close CMD;
}