sexta-feira, 2 de setembro de 2011

Oracle - Agente de backup com RMAN em fita


Este agente servirá para o seguinte propósito. Fazer backup completo da base com ela online, copiar controlfiles, spfile.

Considerações importantes:

- Necessário database de catálogo;
- Executar no crontab do 'root';
   * Exemplo: 00 02 * * * /oracle/scripts/rman/rman-backup_oracle.pl -C B -v 1 >> /dev/null 2>&1
- Alterar variáveis de ambiente de acordo com sua necessidade;
- Ajustar variável path para sua necessidade;
- Necessário satisfazer a estrutura $path/log;
- Necessário ajustar valores do arquivo $path/lib/oracle.params;
   * Conteúdo do arquivo:


CATALOGDB=rman
CATALOGUSER=rman
CATALOGPASS=teste123
AUXILIARYDB=orcl
AUXILIARYUSER=sys
AUXILIARYPASS=oracle123

- Necessário criar os seguintes arquivos;

$path/lib/rman-restore.sql : 

# Oracle RMAN Command File
# This script opens a single channel to the target database and does a
# backup of all the database.
run {
 shutdown immediate; # use abort if this fails
 startup mount;
 allocate channel t1 type 'sbt_tape';
 restore database;
 recover database;
 release channel t1;
 alter database open;
}
# EOF

$path/lib/rman-backup.sql : 

# Oracle RMAN Command File
# This script opens a single channel to the target database and does a
# backup of all the database.
run {
allocate channel t1 type 'sbt_tape';
backup database;
release channel t1;
}
# EOF


Funções:

- Argumento "B" realiza o backup;
- Argumento "R" realiza recovery de todos objetos do backup;


Código fonte:


#!/usr/bin/perl
#
# Description: Backup Oracle Database (RMAN backup)
#
#
#Author:
#        Gabriel Prestes (helkmut@gmail.com)
#
#07-31-2011 : Created

# Modules
use strict;
use POSIX;
use Getopt::Long;
use File::Basename;
use Switch;

# ENVs
$ENV{"USER"}="oracle";
$ENV{"HOME"}="/oracle";
$ENV{"ORACLE_BASE"}="/oracle";
$ENV{"ORACLE_HOME"}="$ENV{'ORACLE_BASE'}/product/11.1.0/db_1";
$ENV{"ORACLE_SID"}="orcl";
$ENV{"LD_LIBRARY_PATH"}="$ENV{'ORACLE_HOME'}/lib:$ENV{'ORACLE_HOME'}/oc4j/j2ee/home/lib/";

# Global variables
 our $name = basename($0, ".pl");
 our $version="1.0";
 our $date=strftime("%m-%d-%Y",localtime);
 our $path = "/oracle/scripts/rman";
 our $log= "$path/log/rman-$date.log";
 our ($opt_help, $opt_verbose, $opt_version, $opt_choice);

sub main {

        # --- Get Options --- #
        getoption();

        # --- Init agent --- #
        logger("INIT AGENT - $date");

        # --- Choice your destiny --- #
        switch ($opt_choice) {

                case "R"        {restore();}
                case "B"        {backup();}

                # --- If fail --- #
                else{logger("Agent : Can't call choice");}

        }

        # --- End agent --- #
        logger("END AGENT - $date");

        exit;

}

sub getoption {

     Getopt::Long::Configure('bundling');
     GetOptions(
            'C|choice=s'                => \$opt_choice,
            'V|version'                 => \$opt_version,
            'h|help'                    => \$opt_help,
            'v|verbose=i'               => \$opt_verbose,
        );

     if($opt_help){

             printHelp();
             exit;

     }

     if($opt_version){

             print "$name - '$version'\n";
             exit;

     }

     if(!$opt_verbose){

             $opt_verbose = 0;

     }

     if(!$opt_choice){

             printHelp();
             exit;

     }

}

sub logger {

        return (0) if (not defined $opt_verbose);

        my $msg = shift (@_);

        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
        $wday++;
        $yday++;
        $mon++;
        $year+=1900;
        $isdst++;

        if ($opt_verbose == 0){

                print "$msg\n";

        }

        else {

           open(LOG, ">>$log") or do error();
           printf LOG ("%02i/%02i/%i - %02i:%02i:%02i => %s\n",$mday,$mon,$year,$hour,$min,$sec,$msg);
           close(LOG);

        }

}

sub printHelp {

                my $help = <<'HELP';

                This is a agent to Backup Oracle instance - RMAN

                Arguments:

                -C  : Backup(B) or Restore(R)
                -V  : Version
                -h  : Help
                -v 1: Send to log
                -v 0: Show log in console

                Required APIs:

                use strict;
                use Getopt::Long;
                use POSIX;
                use File::Basename;

                E.g: $path/rman-backup_oracle.pl -C B -v 1

       



HELP

                system("clear");
                print $help;

}

sub backup {

        my $counter = 0;
        my $script = "$path/lib/rman-backup.sql";
        my $rman = "$ENV{'ORACLE_HOME'}/bin/rman";
        my $oracle_catdb;
        my $oracle_catuser;
        my $oracle_catpass;
        my $oracle_auxdb;
        my $oracle_auxuser;
        my $oracle_auxpass;
        my @prop_split=();

        open (PROPS, "$path/lib/oracle.params") or error();
        my @props_array = <PROPS>;
        close(PROPS);

        foreach(@props_array){

                chomp($_);
                @prop_split = split(/=/,$_);

                if($counter == 0){$oracle_catdb = $prop_split[1];}
                if($counter == 1){$oracle_catuser = $prop_split[1];}
                if($counter == 2){$oracle_catpass = $prop_split[1];}
                if($counter == 3){$oracle_auxdb = $prop_split[1];}
                if($counter == 4){$oracle_auxuser = $prop_split[1];}
                if($counter == 5){$oracle_auxpass = $prop_split[1];}
                $counter++;

        }

        my @cmd = `/bin/su - $ENV{'USER'} -c '$rman TARGET $oracle_auxuser/$oracle_auxpass\@$oracle_auxdb CATALOG $oracle_catuser/$oracle_catpass\@$oracle_catdb \@$script'`;

        if($? == 0){logger("BACKUP FINISHED - SUCCESS");}
        else {logger("BACKUP FINISHED - ERROR");}

        open(LOG, ">>$log") or do error();
        foreach(@cmd){
                printf LOG ("$_");
        }
        close(LOG);

}

sub restore {

        my $counter = 0;
        my $script = "$path/lib/rman-restore.sql";
        my $rman = "$ENV{'ORACLE_HOME'}/bin/rman";
        my $oracle_catdb;
        my $oracle_catuser;
        my $oracle_catpass;
        my $oracle_auxdb;
        my $oracle_auxuser;
        my $oracle_auxpass;
        my @prop_split=();

        open (PROPS, "$path/lib/oracle.params") or error();
        my @props_array = <PROPS>;
        close(PROPS);

        foreach(@props_array){

                chomp($_);
                @prop_split = split(/=/,$_);

                if($counter == 0){$oracle_catdb = $prop_split[1];}
                if($counter == 1){$oracle_catuser = $prop_split[1];}
                if($counter == 2){$oracle_catpass = $prop_split[1];}
                if($counter == 3){$oracle_auxdb = $prop_split[1];}
                if($counter == 4){$oracle_auxuser = $prop_split[1];}
                if($counter == 5){$oracle_auxpass = $prop_split[1];}
                $counter++;

        }

        my @cmd = `/bin/su - $ENV{'USER'} -c '$rman TARGET $oracle_auxuser/$oracle_auxpass\@$oracle_auxdb CATALOG $oracle_catuser/$oracle_catpass\@$oracle_catdb \@$script'`;

        if($? == 0){logger("RESTORE FINISHED - SUCCESS");}
        else {logger("RESTORE FINISHED - ERROR");}

        open(LOG, ">>$log") or do error();
        foreach(@cmd){
                printf LOG ("$_");
        }
        close(LOG);

}

&main

2 comentários:

  1. Olá Gabriel!

    Estou estudando RMAN agora, mas uma pergunta, backup direto pra fita é mais rápido que backup em disco?

    Hoje é feito backup em disco, e depois é feito a cópia do disco pra fita.

    Att,

    Sakamoto

    MyTraceLog - Registro de um DBA
    http://mytracelog.blogspot.com

    ResponderExcluir
  2. Depende do disco, depende da fita, mas em disco normalmente é mais rápido até porque se a área utilizada para armazenar backups é a FLASH RECOVERY AREA ela tem de ter discos rápidos.

    ResponderExcluir