| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Back up Oracle database with Legato Light
Here is a perl script that I found that originally used sqlplus. I have
updated it to use DBI.
#!/usr/bin/perl
# ------------------------------------------------------------------------
# hotarch -- hotarchive backup for Microsoft copied from ye olde shell
script
# G. Patterson, Nov 2001
#
use File::Basename;
use File::Copy;
use DBI;
use Compress::Zlib;
use File::Slurp;
$MyPath = dirname($0);
# ------------------------------------------------------------------------
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 Compress {
$in_file=$_[0];
$out_file=$_[1];
$status=0;
open(OUTFILE,'>',$out_file) or die "could not open $out_file";
binmode INFILE;
binmode OUTFILE;
my $gz = gzopen(\*OUTFILE, "wb") or die "Cannot open stdout: $gzerrno\n" ;
# while (read(INFILE, $input, 32768)) {
# $gz->gzwrite($input) ;
# last if $status != Z_OK ;
# }
$input = read_file($in_file);
$gz->gzwrite($input) ;
$gz->gzclose ;
#close INFILE;
close OUTFILE;
return $status;
}
# ------------------------------------------------------------------------
sub OraDo {
($thesql) = $_[0];
$status=0;
print "OraDo $thesql\n";
$sth2 = $dbh->prepare($thesql) or wrapup();
if ($DBI::errstr) {
LogMsg "$thesql\nParse Error $DBI::errstr\n";
$status=-1;
}
LogMsg "$thesql\nExec Error $DBI::errstr\n";
$status=-1;
}
($thesql) = $_[0];
$status=0;
print "OraQry $thesql\n";
$sth1 = $dbh->prepare($thesql) or wrapup();
if ($DBI::errstr) {
LogMsg "$thesql\nParse Error $DBI::errstr\n";
$status=-1;
}
LogMsg "$thesql\nExec Error $DBI::errstr\n";
$status=-1;
}
local($SQL)=<<EOF;
declare
my_exception exception;
cursor thecsr is
select 'alter tablespace ' || TABLESPACE_NAME || ' end
backup' the_ts
from dba_tablespaces;
begin
for therec in thecsr loop
begin
execute immediate therec.the_ts;
exception when others then null;
--raise_application_error(-20001,'Exception
occured.' || sqlcode || sqlerrm);
end;
end loop;
end;
EOF
$rtn=OraDo($SQL);
# ------------------------------------------------------------------------
sub problem{
# Err Houston? ... Houston ... We have a problem ...
LogMsg "ERROR: $_[0]";
# make a last ditch effort to end backup
stop_backup();
wrapup();
die "$_[0]\n";
# ------------------------------------------------------------------------
sub wrapup {
$dbh->disconnect;
close LOG;
unlink $lockfile;
unlink $stopfile;
sub get_log_info{
$SQL = 'select log_mode from v_$database';
$rtn=OraQry($SQL);
($arch_mode) = $sth1->fetchrow_array;
$sth1->finish;
$rtn=OraQry('select archiver from v_$instance');
($archiver) = $sth1->fetchrow_array;
$sth1->finish;
$rtn=OraQry('select value from v_$parameter where name = ' . "'" .
'log_archive_dest' . "'");
($arcdir) = $sth1->fetchrow_array;
$sth1->finish;
$rtn=OraQry('select max(recid) from v_$archived_log where ' . "
archived = 'YES'");
($log_cur_seq) = $sth1->fetchrow_array;
$sth1->finish;
$rtn=OraQry('select sequence# from v_$log where ' . "archived =
'NO'");
($next_archive) =$sth1->fetchrow_array;
$sth1->finish;
# ------------------------------------------------------------------------
sub get_oraparm{
# retrieve parameter values from v$parameter
$SQL = 'select name from v_$database';
$rtn=&OraQry($SQL);
($orasid) = $sth1->fetchrow_array;
$sth1->finish;
# ------------------------------------------------------------------------
sub backup_mode{
# alter tablespace begin/end backup
$SQL="alter tablespace $_[0] $_[1] backup";
$rtn=OraDo($SQL);
# ------------------------------------------------------------------------
sub backup_init{
$BKUPDIR= $ENV{BKUPDIR} or die "Environment missing BKUPDIR can not run!";
get_oraparm();
get_log_info();
@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",$BKUPDIR,$orasid,$MyName,
$start[5]%100,$start[4]+1,$start[3];
open(LOG,">$logfile") || die "error opening $logfile\n";
LogMsg "$MyName started at $start_str ORACLE_SID:
$orasid ORACLE_HOME: $ENV{ORACLE_HOME} BLOCK_SIZE:
$db_block_size START_SEQNO: $log_cur_seq Archive Mode:
$arch_mode";
$lockfile = "$BKUPDIR\/hotarch.$orasid.lock";
$stopfile = "$BKUPDIR\/hotarch.$orasid.stop";
if ((-f $lockfile) && (-M $lockfile < 1)) {
LogMsg "$MyName is already running";
wrapup();
exit(5);
}
open (LOCK,">$lockfile") || die "Cannot write to $lockfile";
print LOCK "$MyName started $start_str\n";
close (LOCK) || die "$!";
#
if ($arch_mode =~ "ARCHIVELOG") {}
else {
LogMsg "Error! No Archive Mode";
wrapup();
exit(5);
}
if ($archiver =~ "STARTED") {}
else {
LogMsg "Error! Archive disabled";
wrapup();
exit(5);
}
if ($arcdir) {}
else {
LogMsg "Error! No archive log destination";
wrapup();
exit(5);
}
stop_backup();
# ------------------------------------------------------------------------
sub backup_control_file{
# create a backup copy of the control file
my $backup_ctrl = "$BKUPDIR" . '/' . uc($orasid) . "_CTRL.FILE";
unlink "$backup_ctrl";
$SQL = "alter database backup controlfile to '$backup_ctrl'";
$rtn=OraDo($SQL);
# ------------------------------------------------------------------------
sub backup_dbfs {
local($SQL)=<<EOF;
select tablespace_name,file_name
from dba_data_files where status = 'AVAILABLE'
order by tablespace_name, file_name
EOF
$rtn=OraQry($SQL);
my $j = 0;
$df_cnt = 0;
$last_tsname="";
while( ($ts_name,$file_name) = $sth1->fetchrow_array ) {
$df_cnt++;
LogMsg "copying $ts_name, $file_name";
LogMsg "$ts_name $last_tsname";
if (index($ts_name,$last_tsname) > 0 ) {}
else {
if ($last_tsname) {
backup_mode $last_tsname,"END";
}
backup_mode $ts_name,"BEGIN";
$last_tsname = $ts_name;
}
($base_name)=basename($file_name);
$rtn=Compress( $file_name,$BKUPDIR . '/' . $base_name .
'.gz');
if ($rtn != Z_OK ) {
LogMsg "error copying $file_name";
}
}
backup_mode $last_tsname,"END";
problem "no data files available" unless ($df_cnt > 0);
$sth1->finish;
$SQL = "alter system switch logfile";
$rtn=OraDo($SQL);
$SQL = "alter system switch logfile";
$rtn=OraDo($SQL);
do {
OraQry('select max(recid) from v_$archived_log where ' . "
archived = 'YES'");
($log_nxt_seq) = $sth1->fetchrow_array;
$sth1->finish;
sleep(60);
} until $log_nxt_seq > $log_cur_seq;
}
# ------------------------------------------------------------------------
sub copy_log_files{
my $i;
my $next_log = $next_archive;
$SQL='select name from v$archived_log where ' . " ARCHIVED = 'YES'";
&OraQry($SQL);
$df_cnt = 0;
while( ($file_name) = $sth1->fetchrow_array ) {
($base_name)=basename($file_name);
if (-r "$arcdir\/$base_name") {
$df_cnt++;
LogMsg "compressing & moving $file_name";
$rtn=Compress($file_name,$BKUPDIR . '/' . $base_name
. '.gz');
if ($rtn != Z_OK ) {
LogMsg "error copying $file_name";
}
else {
unlink "$file_name";
}
}
else {
LogMsg "archive log $file_name not here";
}
}
$sth1->finish;
# ------------------------------------------------------------------------
# Main ... start here:
$MyName = basename $0,"\.pl";
$dbh = DBI->connect("dbi:Oracle:", '', '',{ ora_session_mode => 2})
or die "Login error to db";
backup_init();
backup_dbfs();
stop_backup();
backup_control_file();
copy ($ENV{ORACLE_HOME} . '/dbs/init' . $orasid . '.ora',$BKUPDIR);
if ($!) {
LogMsg "Error copy " . $ORACLE_HOME . '/dbs/init' . $orasid
. '.ora' . " $!. Return code was $? ";
}
switch_log();
copy_log_files();
LogMsg "$MyName completed normal";
wrapup();
exit(0);
HTH
Frank P.
"Karsten Farrell" <kfarrell_at_belgariad.com> wrote in message
news:ZHES9.708$Qk5.50370665_at_newssvr21.news.prodigy.com...
> Craig S. Ledbetter wrote:
> > You don't say what OS you are using, but if it is a Unix, try looking at
the
> > oraback.sh (a Bourne shell script). Info at > > http://www.backupcentral.com/oraback.html > > It takes some configuration, but it will do anything you want it to. > > CSL > > > > "John Wood" <jwood_at_hotmail.com> wrote in message > > news:uJ9Q9.70904$xp4.2626319_at_news1.telusplanet.net... > > > >>As Orcle 9i comes with Legato light vesion, I would like to find outinfo
> >>procedures in setting it up to back up to tape drive. > >> > >>By the way, is there any other good Oracle Backup utility I can use. > > > > Please > > > >>advise. > >> > >>Thanks. > >> > >>EW > >> > I agree, oraback.sh is a great shell script. However, the last time I > looked at it, calls to 'svrmgrl' were scattered all over it ... and > since the OP is using 9i, that won't fly. Have they updated the script? > I started to do that myself ... but like many open-source scripts, this > one had way too many "cooks in the kitchen" (spagetti code, some of > which is never executed). >Received on Tue Jan 07 2003 - 21:05:18 CST
![]() |
![]() |