Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Re: 30454.1- Unix script that automates warm backup of all available tablespaces ??
Hi!
Which shell are you using?
I'll paste a modified version of the script here which works with bash under
linux.
The comments are in estonian, you might want to change them if the script
works for you.
Tanel.
# Oracle poolt tehtud andbebaasi online-backup skripti modifikatsioon
# Tanel Põder 20030727
#
# Oracle andmebaasi online-backup skript
# Kasutab alter tablespace begin/end backup käske ja unixi
# käske cp või tar failide kopeerimiseks, vastavalt backupi sihtkohale
#
# Kasutamine:
# hotbackup.sh <backupi asukoht>
# Asukoht võib olla nii kataloog kui näiteks lindiseadme nimi
# Näide:
# hotbackup.sh /home/oracle/backup
# Kopeerib online backupi käigus andmefailid ja controlfaili
# /home/oracle/backup kataloogi
#
# Skript tagastab veakoodi 1 vea puhul, 0 õnnestumise puhul ja
# saadab e-maili NOTIFYADDR muutujaga määratud aadressil
#
# Mugandatavad parameetrid:
ORAENV_ASK=NO # Et ei kysiks ORACLE_SID vaartust - v6tab selle, mis
keskkonnas maaratud
export ORAENV_ASK
NOTIFYADDR="user_at_mail.com"
export NOTIFYADDR
if [ -z "$1" ]
then
echo "" >&2
echo "Usage: hobackup.sh <target>" >&2
echo "" >&2 echo " <target> - directory name or tape device for tar" >&2 echo "" >&2
. $ORACLE_HOME/bin/oraenv
# set ORACLE environment
echo "" echo "Warm database backup of $ORACLE_SID on host `hostname`" echo "Log will be written to warm.backup.`hostname`.${ORACLE_SID}.log" echo ""
# log file
exec >>warm.backup.`hostname`.${ORACLE_SID}.log exec 2>&1
echo "" echo "**** Warm database backup of $ORACLE_SID at `date` on `hostname` ****" echo ""
# prepare backup target
TARGET=$1
export TARGET
if [ -d "$TARGET" ]
then
echo "Target is the directory $TARGET"
elif [ -c "$TARGET" ]
then
echo "Target is the character device $TARGET - tar will be used"
else
echo
"ERROR: Target is neither a directory nor a character special file"
echo ""
echo "**** Backup ABORTED at `date` !!! ****"
echo ""
exit 1
fi
if
[ ! -w "$TARGET" ]
then
echo "ERROR: Target is not writable"
echo ""
echo "**** Backup ABORTED at `date` !!! ****"
echo ""
exit 1
fi
test -d "$TARGET"
TAR=$? # 0 for directory, otherwise tarexport TAR
# check if the database instance is up
sqlplus -SILENT "/ as sysdba" > /tmp/warm.backup.${ORACLE_SID}.tmp <<EOF
WHENEVER SQLERROR EXIT 1 SELECT count(*) FROM sys.dba_tablespaces;
if [ "$EXITCODE" -ne 0 ]
then
echo "ERROR: Database instance $ORACLE_SID is not up !!!" echo "" echo "**** Backup ABORTED !!! ****"
echo ""
exit 1
fi
# get list of files to backup
# (modify sqlplus line to accommodate your usr/pwd)
echo "Getting names of files to backup ..."
sqlplus -SILENT "/ as sysdba" > /tmp/warm.backup.${ORACLE_SID}.tmp <<EOF
WHENEVER SQLERROR EXIT 1 SET TAB OFF SET PAGESIZE 0 SET LINESIZE 300 SET FEEDBACK OFF SELECT tablespace_name || ' ' ||file_name FROM sys.dba_data_files WHERE status = 'AVAILABLE' ORDER BY tablespace_name;
if [ "$EXITCODE" -ne 0 ]
then
echo "ERROR: SQL*Plus exit code: $EXITCODE"
cat /tmp/warm.backup.${ORACLE_SID}.tmp
echo ""
echo
"**** Backup ABORTED at `date` !!! ****"
echo ""
exit 1
fi
if
[ ! -s /tmp/warm.backup.${ORACLE_SID}.tmp ]
then
echo "ERROR: No files available for backup" echo "" echo "**** Backup ABORTED at `date` !!! ****"
echo ""
exit 1
fi
# prepare SQL*Plus command script executing backup
echo "Preparing command script ..."
cat <<EOF > /tmp/backup_${ORACLE_SID}.awk BEGIN {
prev_tbs = "" # no tablespace processed yettar=${TAR}
num = 1 # start number for files}
tablespace = \$1 # extract tablespace and file name
filename = \$2
# from SQL*Plus output
count=split(filename, a, "/")
if (prev_tbs != tablespace) # if at the begining of files
{
# of next tablespace: if (length(prev_tbs) > 0) # end backup of previous tbsp print "ALTER TABLESPACE " prev_tbs " END BACKUP;\n" print "ALTER TABLESPACE " tablespace " BEGIN BACKUP;"
}
if (tar) # "tar" if to special device print "!tar cvAf " target " " filename else # "cp" if to directory print "!cp " filename " " target "/" a[count] "." num
prev_tbs=tablespace
num = num + 1
}
END { if (length(prev_tbs) > 0) # end backup of last tabspace
print "ALTER TABLESPACE " prev_tbs " END BACKUP;"
print ""
if (!tar) # backup control and init file { print "ALTER DATABASE BACKUP CONTROLFILE TO " "'" target \ "/ctrl" sid ".ctl." num "';" num = num + 1 print "!cp " home "/dbs/init" sid ".ora " \ target "/init" sid ".ora." num } else { # if tar, use temporary file print "ALTER DATABASE BACKUP CONTROLFILE TO " "'" \ home "/tmp/ctrl" sid ".ctl.tmp';" print "!cd " home "/tmp; tar cvf " target " ctrl" sid ".ctl.tmp" print "!cd " home "/dbs; tar cvf " target " init" sid ".ora"
}
print ""
}
EOF
awk -f /tmp/backup_${ORACLE_SID}.awk \
/tmp/warm.backup.${ORACLE_SID}.tmp > /tmp/warm.backup.${ORACLE_SID}.tmp1
# do backup
echo "Copying files ..."
sqlplus -SILENT "/ as sysdba" <<EOF
WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 1 SET ECHO ON START /tmp/warm.backup.${ORACLE_SID}.tmp1 ALTER SYSTEM ARCHIVE LOG CURRENT;EOF EXITCODE=$?
if [ "$EXITCODE" -ne 0 ]
then
echo "ERROR: SQL*Plus exit
code: $EXITCODE"
echo ""
echo "**** Backup ABORTED at `date` !!! ****"
mail $NOTIFYADDR -s "${ORACLE_SID} backup serveris `hostname`
ebaõnnestus\!" < \
warm.backup.`hostname`.${ORACLE_SID}.log
echo ""
exit 1
fi
echo "" echo "**** Backup finished at `date` ****" echo "" mail $NOTIFYADDR -s "${ORACLE_SID} backup serveris `hostname` OK" < \ warm.backup.`hostname`.${ORACLE_SID}.log --------------------------------------------------------------------------
"Subrahmanyam Arya" <avsrk_at_mailcity.com> wrote in message news:25c1993e.0308280610.7b1aa993_at_posting.google.com...
> Hi there, > I am on solaris. As mentioned by you i fixed the line which read > cat <<EOF > /tmp/backup_${ORACLE_SID}.awk > > BEGIN > > { > > to > cat <<EOF > /tmp/backup_${ORACLE_SID}.awk > > BEGIN { > > This made the following errors go away > awk: syntax error near line 2 > awk: bailing out near line 2 > > But now i get the following errors in warm.backup.<sid>.log file > Preparing command script ..... > awk: syntax error near line 42 > awk: illegal statement near line 42 > awk: syntax error near line 50 > awk: illegal statement near line 50 > > and the line 42 in my /tmp/backup_${ORACLE_SID}.awk file is this > > print "ALTER DATABASE BACKUP CONTROLFILE TO " "'" target \ > "/ctrl" sid ".ctl." num "';" > > I would appreciate if somebody already used this script successfully, > can they cut and paste the awk portion of the script which i can cross > test against mine. > > -Sincerely, (admit that i am starnger to awk/sed..and am beginning to > learn via this...) > avsrk > > > "Tanel Poder" <change_to_my_first_name_at_integrid.info> wrote in messagenews:<3f4d1b5c$1_1_at_news.estpak.ee>...
> > Hi! > > > > Which platform are you on, Linux? > > > > Try to search and replace: > > > > cat <<EOF > /tmp/backup_${ORACLE_SID}.awk > > BEGIN > > { > > > > with > > > > cat <<EOF > /tmp/backup_${ORACLE_SID}.awk > > BEGIN { > > > > These are the nasty small differences in various Unix'es and Linux'es > > shells... > > > > Tanel. > > > > "Subrahmanyam Arya" <avsrk_at_mailcity.com> wrote in message > > news:25c1993e.0308271156.3360d350_at_posting.google.com... > > > Dear Oracle gurus, > > > > > > I am looking at a unix script that automates warm backup of all > > > available tablespaces and found in metalink a doc-id (30454.1)which > > > has this script documented. Unfortunately i have problems running this > > > script as it is.. It is resulting in some awk errors. > > > > > > Can anybody give me this script in working form if they have tried it. > > > > > > -thanks, > > > avsrkReceived on Thu Aug 28 2003 - 11:12:20 CDT