#!/bin/sh
#
# ====================================================================
#  Procedure de duplication de base
#  Origine:
#  SIRPC         X.THUAULT
#  adaptations:
#  SYSTEA IG     F.SOYER
# ====================================================================

################################
# IMPORTANT
# Créer un fichier d'init de ${CLONE_SID} dans ${ORACLE_INITPATH} (voir ci-dessous)
#################################################################
# parametre pour clonage (exemple)
#
# DB_FILE_NAME_CONVERT=(/u01/data/${ORACLE_SID},/oracle/data/AUX${ORACLE_SID},/u01/data2/${ORACLE_SID},/oracle/data2/AUX${ORACLE_SI D})
# LOG_FILE_NAME_CONVERT =(/u01/data/${ORACLE_SID},/oracle/data/AUX${ORACLE_SID},/u01/data2/${ORACLE_SID},/oracle/data2/AUX${ORACLE_ SID})
# DB_CREATE_FILE_DEST=/oracle/data/AUX${ORACLE_SID}
###############################
# VERIFIER LE TNSNAME vers la base destination
# VERIFIER LE NOM DU TABLESPACE UNDO sur la base destination (doit être identique à la source)
# S'ASSURER que le fichier d'init dans ${ORACLE_INITPATH} contient les bons paramètres d'archive log pour la base destination (et que le répoertoire des archives est créé)
# S'ASSURER que le répertoire des fichiers de sauvegarde RMAN est lisible par ${CLONE_USER}

###############################
# VARIABLES
##############################
# serveur et user oracle source
export ORACLE_SERVEUR=srvorasrc
export ORACLE_USER=oracle
# serveur et user oracle destination
export CLONE_SERVEUR=srvoradst
export CLONE_USER=oracle
# user SYS destination
export CLONE_SYS='sys/manager'
# SID source et destination
export ORACLE_SID=ORASRC
export CLONE_SID=ORADST

# Répertoire entrepot fichiers init.ora clone à copier
export ORACLE_INITPATH=/home/oracle/dbs
# Répertoire destination init.ora base clone (=$ORACLE_HOME/dbs)
export CLONE_INITPATH=/u01/app/oracle/product/11.2.0/dbhome_1/dbs
# Répertoire définitif fichier init.ora destination (pour stocker si besoin le pfile dans un répertoire différent de $ORACLE_HOME/dbs)
export CLONE_ALTINITPATH=/u01/app/oracle/product/11.2.0/dbhome_1/dbs
# Répertoire archives source
export ORACLE_ARCHIVEPATH=/archives/{ORACLE_SID}
# Répertoire archives destination
# ATTENTION : pendant la duplication, rman cherchera les archives dans le même chemin que la base source, penser à recréer $ORACLE_ARCHIVEPATH à la destination !
export CLONE_ARCHIVEPATH=/oracle/data/{CLONE_SID}/archives
# User@catalog RMAN
export RMAN_CATALOG=user_rman/pwd_rman@BASERMAN

function print_usage {
        echo "  "
        echo "Usage:   $0    <date>  "
        echo "  "
        echo "   <date> si restauration non totale format DD-MM-AAAA_HH:MM   ex: 13-02-2012_14:30"
        echo "  "
        echo "Script a lancer uniquement sous ${ORACLE_USER} "

        echo "  "
        echo "Aujourd hui: "
        date '+%d-%m-%Y_%H:%M'
        echo " "
}

if [ $# -eq 0 ]
then
     print_usage `basename $0`
     exit -1
fi

type="DISK"

MACHINE=` uname -n  `

if [ $MACHINE  != ${ORACLE_SERVEUR}  ]
then
   echo " Operation a faire sous ${ORACLE_SERVEUR} "
   exit -1
fi

if [ `whoami` != ${ORACLE_USER}  ]
then
   echo " Operation a faire sous ${ORACLE_USER} "
   exit -1
fi

DATE_DUPLI=$1

# Si nécessaire, si les backups et/ou archives sont sur une partition, décommenter ci-dessous
#echo mount /backup
#sudo mount /backup
#ssh ${CLONE_USER}@${CLONE_SERVEUR} "sudo mount /backup"

# -----------------------------------------------------------------
date_jour=`date '+%d-%m-%Y  %H:%M:%S'`
echo " "
echo " Demarrage des processus de duplication de la base $ORACLE_SID vers $CLONE_SID a $date_jour pour "
echo " "
echo "Copie du fichier init${CLONE_SID}.ora"
ssh ${CLONE_USER}@${CLONE_SERVEUR} "rm -f ${CLONE_INITPATH}/spfile${CLONE_SID}.ora"
scp ${ORACLE_INITPATH}/init${CLONE_SID}.ora ${CLONE_USER}@${CLONE_SERVEUR}:${CLONE_INITPATH}/init${CLONE_SID}.ora

# Pour debug :
#echo "<<pause>>"
#read pause

echo " ------------------> Demarrage en nomount de la base clone ${CLONE_SID}  "
# Attention le chemin est celui du serveur local, l'init.ora est lu ici au startup
echo " "
echo " sqlplus ${CLONE_SYS}@${CLONE_SID} AS SYSDBA  "
sqlplus ${CLONE_SYS}@${CLONE_SID} AS SYSDBA <<EOF3
   STARTUP FORCE NOMOUNT pfile='${ORACLE_INITPATH}/init${CLONE_SID}.ora';
   exit ;
EOF3

# Pour debug :
#echo "<<pause>>"
#read pause

echo " "
echo "  ------------------> Suppression des archives sur le serveur  ... "
ssh ${CLONE_USER}@${CLONE_SERVEUR} "find ${CLONE_ARCHIVEPATH} -type f  -print -name \"*.arc\"  | xargs rm ; df -h ${CLONE_ARCHIVEPATH}"

echo " "
echo "  ------------------> Copie des archivelogs sur serveur distants ..."
# rman cherchera les archives dans le chemin de la base source, penser à le recréer à la destination
ssh ${CLONE_USER}@${CLONE_SERVEUR} "ls ${ORACLE_ARCHIVEPATH}"
if [ $? -ne 0 ]
then
   echo "Répertoire ${ORACLE_ARCHIVEPATH} inexistant sur ${CLONE_SERVEUR} !"
   echo "Abandon..."
   exit 1
fi
scp ${ORACLE_ARCHIVEPATH}/* ${CLONE_USER}@${CLONE_SERVEUR}:${ORACLE_ARCHIVEPATH}/
echo " "

# Pour debug :
#echo "<<pause>>"
#read pause

echo "   ------------------> DUPLICATION RMAN de ${ORACLE_SID} vers ${CLONE_SID}  ... "
echo " "
cmdfile='rman_duplication_'${ORACLE_SID}'.rs'
#
echo "  base clone repliquee a $DATE_DUPLI "
# TIPS : si RMAN s'arrete sur l'erreur :
#   RMAN-06053: unable to perform media recovery because of missing log
#   RMAN-06025: no backup of archived log for thread 1 with sequence 89163 and starting SCN of 11158664662 found to restore
# l'archive log contenant la sequence 89163 peut etre absente ou corrompue. On peut cependant relancer la duplication
# jusqu'a cette archive. Enlever la ligne "SET UNTIL TIME "to_date('${DATE_DUPLI}:00','DD-MM-YYYY_HH24:MI:SS')";" et la
# remplacer par :
#       SET UNTIL SEQUENCE 89163 THREAD 1;
# Autres tips:
# SET UNTIL TIME "to_date('${DATE_DUPLI}:00','DD-MM-YYYY_HH24:MI:SS')";
# sql ' alter session set NLS_DATE_FORMAT="DD-MM-YYYY_HH24:MI:SS" ';

cat << EOF > $cmdfile
run {
       SET UNTIL TIME "to_date('${DATE_DUPLI}:00','DD-MM-YYYY_HH24:MI:SS')";
       allocate channel c1 device type $type ;
       allocate auxiliary channel auxCh1 device type $type ;
       DUPLICATE TARGET DATABASE TO  ${CLONE_SID} NORESUME pfile='${ORACLE_INITPATH}/init${CLONE_SID}.ora' ;
}
EOF

# Pour debug :
#echo " ATTENTION : vérifier que les fichiers de sauvegarde RMAN dans /backup sont bien lisible pour tous (chmod 744)"
#echo "<<pause>>"

echo "rman target /  AUXILIARY ${CLONE_SYS}@${CLONE_SID} catalog ${RMAN_CATALOG} cmdfile $cmdfile "
rman target / AUXILIARY ${CLONE_SYS}@${CLONE_SID} catalog ${RMAN_CATALOG} cmdfile $cmdfile

# Pour debug :
#echo "<<pause>>"
#read pause

# Si une partition de backup a été montée au départ, on peut désormais la démonter
#ssh ${CLONE_USER}@${CLONE_SERVEUR} "sudo umount -f /backup"
#sudo umount -f /backup

echo " "
echo " ------------------>  Redemarrage mode non archivelog  "
echo " "
sqlplus ${CLONE_SYS}@${CLONE_SID} AS SYSDBA <<EOF4
   shutdown immediate;
   startup mount pfile='${ORACLE_INITPATH}/init${CLONE_SID}.ora';
   alter database noarchivelog;
   alter database open;
   create spfile='${CLONE_ALTINITPATH}/spfile${CLONE_SID}.ora' from pfile='${CLONE_INITPATH}/init${CLONE_SID}.ora';
   exit ;
EOF4
ssh ${CLONE_USER}@${CLONE_SERVEUR} "ln -s ${CLONE_ALTINITPATH}/spfile${CLONE_SID}.ora ${CLONE_INITPATH}/spfile${CLONE_SID}.ora"

ssh ${CLONE_USER}@${CLONE_SERVEUR} "rm f ${ORACLE_ARCHIVEPATH}/*"

# Si nécessaire, ajouter ci-dessous des commandes à passer à la destination après duplication. Exemples :
#echo " "
#echo "  ------------------> Gestion du directory datapump "
#sqlplus  sys/change_on_install@${CLONE_SID} as sysdba  <<EOF5
#  set heading off
#  CREATE  OR REPLACE   DIRECTORY DPUMP_CB AS   '/backup/datapump';
#EOF5

#echo " "
#echo "  ------------------> Calcul des statistiques  sur ${CLONE_SID}   ..."
#sqlplus -s system/manager@${CLONE_SID} <<!
#        set heading off
#        set linesize 400
#        spool calcul_stat_base.sql
#        select ' execute DBMS_UTILITY.analyze_schema('''||username||''', ''COMPUTE''); '
#        from dba_users
#        where username not in ('SYSTEM','SYS');
#        spool off
#        @calcul_stat_base.sql
#        exit;
#!

echo " "
echo "  ------------------>   FIN  Base en Etat open si OK    "

date_jour=`date '+%d-%m-%Y  %H:%M:%S'`

echo "                         Fin de la duplication $date_jour "
echo " "
