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
Olá Gabriel!
ResponderExcluirEstou 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
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