#!/bin/bash
# Procedura za redovni backup lokalne baze 
# Author: Davorin Perković, Pjer
# Changed: 15.11.2022




. ~/.bash_profile

# OLD_PATH=$pwd
pushd ${0%/*}  > /dev/null  2>&1

# Postavke koje treba podesiti za svaki pojedini slučaj
# Podrazumijeva se da postoji service name oracle  za lokalnu i oracle2 za #ote (clone) bazu
# čak iako je riječ o XE bazama

# --BEGIN
ORACLE_SID=orcl
# ORACLE_SID=XE
BACKUP_BASE=/u02/backup
SYSPWD=oracle
# --END


RUNTIME=`date '+%H%M_%d%m%Y'`

LOGFILE=${BACKUP_BASE}/rman_backup_${RUNTIME}.log
BACKUPDIR=${BACKUP_BASE}/rman
if [ $(date +%u) -eq 1 ] 
then
   BACKUP_STATUS_FILE=${BACKUP_BASE}/backup_status_$(date -dmonday +%d)_$(date -dsunday +%d_%m_%Y).log
else
   BACKUP_STATUS_FILE=${BACKUP_BASE}/backup_status_$(date -dlast-monday +%d)_$(date -dsunday +%d_%m_%Y).log
fi   


if [[ -f "rman.run" ]]; then
   exit
fi



echo ${RUNTIME} > rman.run
echo ${RUNTIME} > ${BACKUP_BASE}/error.log 

set -o errtrace

on_error() {
  echo "(Line: $2; cmd $3 -> err $1)" >> ${BACKUP_BASE}/error.log 
}

trap 'on_error $? $LINENO "$BASH_COMMAND"' ERR

case "$1" in
    1)
        INCLEVEL=1
        ;;
    0)
        INCLEVEL=0
        ;;
    *)
        if [ `date +%u`  -eq '1' ]
        then
          INCLEVEL=0
        else
          INCLEVEL=1
        fi
        ;;
esac

mkdir -p ${BACKUPDIR}  > /dev/null 2>&1


# Brisanje starih logova
find ${BACKUP_BASE}/rman_*.log -mtime +15 -exec rm -f {} \;  > /dev/null 2>&1


# Redovni backup

tee << EOF > rman_backup.rman
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; 
CONFIGURE BACKUP OPTIMIZATION OFF; 
CONFIGURE CONTROLFILE AUTOBACKUP ON; 
CONFIGURE COMPRESSION ALGORITHM 'BASIC'; 
CROSSCHECK ARCHIVELOG ALL; 
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '${BACKUPDIR}/snapcf_${ORACLE_SID}.f'; 
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BACKUPDIR}/ora_cf%F'; 
SQL "ALTER SYSTEM ARCHIVE LOG CURRENT"; 
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL ${INCLEVEL} 
DATABASE format '${BACKUPDIR}/databasefiles_%d_%u_%s_%T'
PLUS  ARCHIVELOG FORMAT '${BACKUPDIR}/archivelogs_%d_%u_%s_%T' DELETE INPUT; 
DELETE FORCE NOPROMPT OBSOLETE; 
REPORT OBSOLETE; 
BACKUP AS COMPRESSED BACKUPSET CURRENT CONTROLFILE FORMAT '${BACKUPDIR}/controlfile_%d_%u_%s_%T'; 
EXIT; 
EOF

# Dohvat statusa backupa

tee  << EOF  > rman_status.sql
conn sys/${SYSPWD}@oracle as sysdba
SET TERMOUT off
SET ECHO OFF
SET FEEDBACK OFF
SET LINESIZE 200
SET PAGESIZE 2000
COL Trajanje FORMAT a20
COL Velicina_baze FORMAT a20
COL Upisano_u_backup FORMAT a20
COL Status FORMAT a30

SPOOL ${BACKUP_STATUS_FILE}

SELECT
    to_char(start_time,'D') " ",   
    to_char(start_time,'DAY') Dan,
    start_time Datum,
    TO_CHAR(start_time,'HH24:MI:SS') Pocetak,
    TO_CHAR(end_time,'HH24:MI:SS') Kraj,
    to_char(1440*(end_time - start_time),'9999.99') || 'min'  Trajanje,
    trim(operation) || ' '||status Status,
    INPUT_BYTES_DISPLAY Velicina_baze,
    OUTPUT_BYTES_DISPLAY Upisano_u_backup
FROM
    v\$rman_backup_subjob_details
WHERE
    trunc(start_time) > SYSDATE-to_char(SYSDATE,'D')
union all
   select 
      '',
      ' ',
      null, 
      '',
      '', 
      '',
      '',
      '',
      '--------------------'
FROM
    dual
union all
    select 
      '',
      '',
      null,
      '',
      '' ,
      '',
      '',
      '',
      TO_CHAR(SUM(OUTPUT_BYTES)/1024/1024/1024,'9999.99')||'G' Upisano_u_backup
FROM
    v\$rman_backup_subjob_details
WHERE
    trunc(start_time) > SYSDATE- to_char(SYSDATE,'D')
order by  3,2;   
exit;
EOF


# Redovni backup
echo -e | tee -a ${BACKUP_BASE}/error.log
echo rman target sys/${SYSPWD}@oracle msglog=${LOGFILE} @rman_backup.rman  |tee -a ${BACKUP_BASE}/error.log 
rman target sys/${SYSPWD}@oracle msglog=${LOGFILE} @rman_backup.rman >> ${BACKUP_BASE}/error.log  2>&1



# Dohvat statusa backupa
echo -e | tee -a ${BACKUP_BASE}/error.log
echo sqlplus /nolog @rman_status.sql  |tee -a ${BACKUP_BASE}/error.log 
sqlplus /nolog @rman_status.sql >> ${BACKUP_BASE}/error.log 2>&1


rm -f rman.run   >> ${BACKUP_BASE}/error.log 2>&1

# Kopiranje na vanjski medij (share)
#
#
#


popd  > /dev/null 2>&1