28 sept 2009

Oracle Offline backup.

Estoy seguro que debe de haber muchos scripts en la web para hacer backup de base de datos, en frió. Pero decidí hacer el mio que dejo aquí.


#!/bin/bash
# Developer: Alejandro Andino
#+-----------------------------+
#| Backup en frio de DataFiles |
#+-----------------------------+


export ORACLE_SID="test"
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="/u01/app/oracle/product/10.2.0/test"
export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
export NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export SQLPATH=/u01/app/oracle/product/10.2.0/test/sqlplus/admin
backup="/u01/app/oracle/backup/datafiles"
arc="/u01/app/oracle/backup/arc"
fecha=`date +"%d%m%y_%H%M"`
sequence=`sqlplus -s system/xxx @lastArcLog.sql|tr -d "[:blank:]"`
seq=$(($sequence-1))

#+-----------------+
#| FUNCTIONS |
#+-----------------+

#Function DEL_OldLogs: Borrar arc log archivados sin uso.
#Variables externas/globales: sequence, seq,arc

function DEL_OldLogs(){
list=`ls $arc | gawk -F "_" -v sq=$seq -v path=$arc '{ if($2 < sq) print path"/"$1"_"$2"_"$3 }'` for i in $list do if [ -f $i ]; then rm -f $i fi done }

# Se me ocurrio pensar que sucedería si se me rompe el disco que justamente guarda los backup. Asi que guardamos el backup en un almacenamiento
#externo también, con esta función.

function New_Backup(){
        rm -f $backup/*.tar.gz
        #Copy datafiles and archivelogs to backup.
        tar -czvf $backup/$file $ORACLE_BASE/oradata/db10g2 $arc &>/dev/null
        chmod +rw $backup/$file
#       Almecenando backup a ubicacion remota.
        smbclient //STORAGE/backup "" --user=backup%password --workgroup=dominio -c "lcd ${backup};cd Backup_DATA;put ${file};exit"

}


#+------------------------+
#| BEGIN SCRIPT |
#+------------------------+

sqlplus -s '/as sysdba' <<"EOF"
archive log all; --> produce ORA-00271: there are no logs that need archiving
ALTER SYSTEM ARCHIVE LOG CURRENT; --> Forzar el archivado de redologs.
shutdown immediate
exit
EOF
#Copiar datafiles y archivelogs al directorio backup .
tar -czvf $backup/DATAfiles$fecha.tar.gz $ORACLE_BASE/oradata/test $arc
 New_Backup #Reemplaza y mejora la funcionalidad de las lineas anteriores ;-)
#Ejecutamos la función.
DEL_OldLogs
#Levantamos la base de datos.
sqlplus -s '/as sysdba'<<"EOF"
startup
exit
EOF
#+------+
#| FIN |
#+------+

Por ultimo el pequeño script que uso para ver la ultima secuencia procesada por el proceso ARCx.

lastArcLog.sql

set echo off
set heading off
set flush off
set pause off
set feedback off
set pages 0
select MAX(sequence#) from v$archived_log;
exit


Este script se ejecuta diariamente, con lo que me deja el backup de los datafiles y los arclog generado por esta.