#!/bin/bash ######################################################################### ######################################################################### ## Fichier de configuration d'environnement Oracle ## Pour infrastructure cluster ou standalone. ## Versions testees: 12.1, 11.2 GI et SA, flex/normal ## ## 2014-08-13 YOM Correction de l'emplacement des journaux cluster vers ADR en 12c ## 2014-08-13 YOM Correction concernant la détection Restart en 12c (olsnodes réponds...) ## 2014-08-20 YOM Correction des alias crsstat et crsstati pour implémenter les variables ORA_CRS car elles ne doivent pas être laissées dans l'environnement ## 2014-12-02 YOM Correction du prompt par défaut ## 2014-12-03 YOM Suppression des alias crsstat et crsstati pour les transformer en scripts ## 2014-12-04 YOM Ajout de l'alias OH pour un « cd $ORACLE_HOME » ## 2015-01-21 YOM Test si le terminal est interractif pour éviter les erreurs TPUT en v7 ## 2016-02-15 YOM Ajout de l'alias « cdt » sur demande de PIL ## 2016-02-16 YOM Paramétrage de la mise à niveau de l'invite de commande ## 2016-02-25 YOM Modifications comportementales pour faciliter l'execution ## 2016-03-29 YOM 12.2 : changement de la conf ulimit pour être OK préco (fonction ajustement_limites) ## 2016-03-04 YOM . Modification du test de démarrage du cluster à cause de la 12c qui change le comportement olsnodes ## . Ajout d'un critère supplémentaire lié à l'alias cdt si le cluster est arrêté ## 2016-04-07 YOM . Ajout de l'alias SID pour la gestion facile de l'environnement ## . Ajustement de la zone d'exploitation ## 2016-06-28 YOM Rectification d'un problème si le cluster est arrêtée qui provoquait unn affichage d'erreur bash non voulu ## 2016-09-05 YOM Changement de l'alias « alert » pour limiter la largeur de ligne d'affichage ## 2016-09-16 YOM Utilisation des fichiers du vocabulaire RLWrap si ils sont présents (demande de THT) ## 2017-05-16 YOM Modification de la présentation de fonction (retrait des ()) pour une meilleure compatibilité ## 2017-08-23 YOM Création d'un fichier qui stocke la configuration repérée afin de ne pas systématiquement recalculer l'ensemble du paramétrage ## 2019-01-08 THT Arret de l'utilisation de local dans la fonction charge pour la variable lNODE_INFO, car l'utilisation de local donnait toujours un code retour à 0 ## 2019-01-23 THT Ajout de opatch dans le PATH de grid et oracle ######################################################################### ## Activation des echo pour DEBUG si mis à 1 DEBUG=0 ## Invite de commande sympa à activer (1 pour activé, 0 pour dormant) : ORAC_INV_C=1 GRID_INV_C=1 ROOT_INV_C=1 ## Contexte APP_CTX=z_oracle.sh HOSTNAME_SIMPLE=`hostname -s` ## Shell interactif ou non ? fd=0 if [[ $- = *i* ]] then INTERACTIF=OUI else INTERACTIF=NON fi ## Ajustement des limites (préconisations Oracle) function ajustement_limites { decho fonction ajustement limites if [ $SHELL = "/bin/ksh" ] ; then ulimit -p 16384 ulimit -n 65536 ulimit -s 32768 else ulimit -u 16384 -n 65536 fi ulimit -Hs 32768 ulimit -Ss 10240 } ## Affichage des messages de sortie de debug function decho { if [ $DEBUG -eq 1 ] ; then echo $APP_CTX: $* fi } ######## Préparation fichier d'historique des informations de contexte FICH_INFOS=/tmp/.z_oracle # Obsolescence parr défaut: 24h FICH_OBS=24 ## Gestion de l'obsolescence du fichier d'historique de configuration # Si il n'existe pas, aucun problème. Sinon, il faut traiter #ls -lrta $FICH_INFOS #ls -lrts /tmp/.z_oracle if [ -r $FICH_INFOS ] ; then # Si obsolete decho "Fichier $FICH_INFOS trouvé" NB_SEC_DEPUIS_EPOCH=`PATH=\`getconf PATH\` awk 'BEGIN{srand();print srand()}'` NB_SEC_DEPUIS_EPOCH_FICHIER=`stat -c %Y $FICH_INFOS` NB_SEC_ECOULEES_MOD=`expr $NB_SEC_DEPUIS_EPOCH - $NB_SEC_DEPUIS_EPOCH_FICHIER` HEURES_MOD=`expr $NB_SEC_ECOULEES_MOD / 3600` if [ $HEURES_MOD -ge $FICH_OBS ] ; then decho "Suppression $FICH_INFOS : obsolète (+${FICH_OBS}h)" rm -f $FICH_INFOS 1>/dev/null 2>&1 touch $FICH_INFOS chmod 666 $FICH_INFOS fi else decho "fichier $FICH_INFOS non trouvé" touch $FICH_INFOS chmod 666 $FICH_INFOS fi # Fonction qui charge une information, soit depuis le contexte, soit depuis le fichier d'infos function charge { # Premier paramètre: le nom de l'élément recherché, identique au nom de la variable d'env du script if [ $# -ne 1 ] ; then decho charge: manque de paramétrage exit 0 fi # Afin d'éviter la globalisation des variables de recherche et ne pas alourdir "l'unset" final, utilisation de variables locales pour la recherche local __varRecherche=$1 # Déjà connu via le fichier d'infos pour chargement rapide et pas reclacul if [ `egrep "^${1}=" $FICH_INFOS | wc -l` -eq 1 ] ; then # OUI local lRep=`egrep "^$1" $FICH_INFOS | cut -d= -f2` eval $__varRecherche="'$lRep'" else # NON : on calcule et on pérénise case $1 in NODE_INFO) lNODE_INFO=`$ORA_CRS_HOME/bin/olsnodes -l -n -a` if [ $? -ne 0 ] ; then # En cluster 11, on n'a pas de -a (mode cluster flex/normal) lNODE_INFO=`$ORA_CRS_HOME/bin/olsnodes -l -n` fi echo "NODE_INFO=$lNODE_INFO" >> $FICH_INFOS eval $__varRecherche="'$lNODE_INFO'" ;; ORA_CRS_CLUSTER_NAME) local lORA_CRS_CLUSTER_NAME=`$ORA_CRS_HOME/bin/olsnodes -c` echo "ORA_CRS_CLUSTER_NAME=$lORA_CRS_CLUSTER_NAME" >> $FICH_INFOS eval $__varRecherche="'$lORA_CRS_CLUSTER_NAME'" ;; ORA_CRS_ACTIVEVERSION) local lORA_CRS_ACTIVEVERSION=`$ORA_CRS_HOME/bin/crsctl query crs activeversion | cut -d[ -f2 | cut -d. -f1` echo "ORA_CRS_ACTIVEVERSION=$lORA_CRS_ACTIVEVERSION" >> $FICH_INFOS eval $__varRecherche="'$lORA_CRS_ACTIVEVERSION'" ;; ORA_CRS_CLUSTERMODE) local lORA_CRS_CLUSTERMODE=`$ORA_CRS_HOME/bin/crsctl get cluster mode config |cut -d\" -f2` echo "ORA_CRS_CLUSTERMODE=$lORA_CRS_CLUSTERMODE" >> $FICH_INFOS eval $__varRecherche="'$lORA_CRS_CLUSTERMODE'" ;; esac fi } ######## decho "Terminal en mode interactif: $INTERACTIF" ## On entre seulement pour certains utilisateurs. ## root een fait partie pour la composante cluster, crsctl, ... if [ $USER = "SED_ORACLE_TARGET__" ] || [ $USER = "SED_GRID_TARGET__" ] || [ $USER = "root" ] ; then decho $USER login profile # Certaines operations ne sont pas a realiser pour root # les limites sont laissees par defaut # ainsi que le masque de creation de fichier ou le stty break. if [ $USER != "root" ] ; then ajustement_limites decho umask et stty break # Masque de création des fichiers umask 022 # Pour prévention SSH if [ -t 0 ]; then stty intr ^C fi fi # préparation pour l'inventaire # Si l'installation a ete realisee, on a un inventaire accessible que l'on peut traiter OLR_LOC=/etc/oracle/olr.loc ORA_INVENTORY_CFFILE=/etc/oraInst.loc decho OLR: $OLR_LOC decho Inventaire: $ORA_INVENTORY_CFFILE # Si l'installation n'est pas faite... on ignore cette partie if [ -f $ORA_INVENTORY_CFFILE ] ; then decho Installation trouvee # On recupere les informations de l'inventaire, pour traitement eventuel ORA_INVENTORY=`grep inventory_loc $ORA_INVENTORY_CFFILE | cut -d= -f2` ORA_INVENTORY_XMLFILE=$ORA_INVENTORY/ContentsXML/inventory.xml # Recuperation de l'emplacement du répertoire prive de l'utilisateur premier oracle ORA_EXPL_DIR=SED_EXPL_REP__ ORA_EXPL_BIN=$ORA_EXPL_DIR/bin ORA_EXPL_SQL=$ORA_EXPL_DIR/sql ORA_EXPL_TMP=$ORA_EXPL_DIR/tmp ORA_EXPL_RLWVOC=$ORA_EXPL_DIR/rlwrap_vocabulaire # Préparation des informations de complément pour RLWrap par rapport aux fichiers de vocabulaire, si présents if [ -r "$ORA_EXPL_RLWVOC/adrci" ] ; then RLW_COMP_ADRCI=" -i -f $ORA_EXPL_RLWVOC/adrci " fi if [ -r "$ORA_EXPL_RLWVOC/asmcmd" ] ; then RLW_COMP_ASMCMD=" -i -f $ORA_EXPL_RLWVOC/asmcmd " fi if [ -r "$ORA_EXPL_RLWVOC/dgmgrl" ] ; then RLW_COMP_DGMGRL=" -i -f $ORA_EXPL_RLWVOC/dgmgrl " fi if [ -r "$ORA_EXPL_RLWVOC/rman" ] ; then RLW_COMP_RMAN=" -i -f $ORA_EXPL_RLWVOC/rman " fi if [ -r "$ORA_EXPL_RLWVOC/sqlplus" -a -d "$ORA_EXPL_RLWVOC/sqlplus" ] ; then LISTE_COMPLEMENTS=`ls $ORA_EXPL_RLWVOC/sqlplus | sed -e "s|^| -f $ORA_EXPL_RLWVOC/sqlplus/|g" | tr '\n' ' '` RLW_COMP_SQLPLUS=" -i $LISTE_COMPLEMENTS " unset LISTE_COMPLEMENTS fi # Test pour savoir si GI installée if [ -f $OLR_LOC ] ; then decho GI installee # Mise en place du pointeur de racine CRS export ORA_CRS_HOME=`grep crs_home /etc/oracle/olr.loc|cut -d= -f2` decho ORA_CRS_HOME = $ORA_CRS_HOME # On utilise olsnodes qui "sors" rapidement pour aussi valider que la couche est UP # sinon on perds un temps phénoménal pour rien avec les timeout crsctl # La remarque n'est plus valable avec la 12C. Donc, ajout d'un test via la ressource ora.crsd $ORA_CRS_HOME/bin/crsctl stat res ora.crsd -init | grep STATE | grep ONLINE 1>/dev/null 2>&1 if [ $? -eq 0 ] ; then # C'est démarré, on peut traiter. charge NODE_INFO export ORA_CRS_NODE_NUM=`echo $NODE_INFO | awk '{print $2}'` export ORA_CRS_NODE_TYPE=`echo $NODE_INFO | awk '{print $3}'` decho ORA_CRS_NODE_NUM = $ORA_CRS_NODE_NUM decho ORA_CRS_NODE_TYPE = $ORA_CRS_NODE_TYPE charge ORA_CRS_CLUSTER_NAME decho ORA_CRS_CLUSTER_NAME=$ORA_CRS_CLUSTER_NAME # Si le cluster n'a pas de nom, c'est que nous sommes en Oracle Restart. Donc pas de query activeversion! if [ "$ORA_CRS_CLUSTER_NAME" != "" ] ; then # Alias qui permet à partir du nom de la base de fixer dynamiquement le SID (depuis ORACLE_SID via oraenv) if [ "$USER" != "root" ] ; then # Ajout d'un alias pour adapter le nom de base vers le sid # le nom de la base est localisé dans le fichier oratab et le nom de l'instance dépend de la configuration alias sid='egrep "^$ORACLE_SID:" /etc/oratab 1>/dev/null 2>&1 && export ORACLE_SID=`LANG=C srvctl status instance -d $ORACLE_SID -n \`hostname -s\`| cut -d" " -f2`' fi charge ORA_CRS_ACTIVEVERSION if [ "$ORA_CRS_ACTIVEVERSION" -eq "12" ] ; then # On peut attendre un cluster flex ou non charge ORA_CRS_CLUSTERMODE # On raccourcis "standard" en "std" si besoin if [ "$ORA_CRS_CLUSTERMODE" = "standard" ] ; then export ORA_CRS_CLUSTERMODE=std fi else export ORA_CRS_CLUSTERMODE=std fi else ORA_CRS_CLUSTERMODE=rst fi decho Mode: $ORA_CRS_CLUSTERMODE else decho Clusterware OFFLINE. # Est-on en RESTART ???!!! if [ `cat /etc/oracle/ocr.loc | grep "local_only=TRUE" |wc -l` -eq 1 ] ; then decho certainement GI standalone pour RESTART ORA_CRS_CLUSTERMODE=rst fi fi # Alias manipulation if [ $USER = "SED_ORACLE_TARGET__" ] ; then # pointeur facile pour crsctl... decho Alias crsctl cree alias crsctl='$ORA_CRS_HOME/bin/crsctl' elif [ $USER = "root" ] ; then decho Ajustement path user root # On ajoute le chemin du cluster dans le PATH export PATH=$ORA_CRS_HOME/bin:$ORA_EXPL_BIN:$PATH elif [ $USER = "SED_GRID_TARGET__" ] ; then decho environnement GI export ORACLE_HOME=$ORA_CRS_HOME export ORACLE_BASE=`$ORACLE_HOME/bin/orabase` export SQLPATH=$ORA_EXPL_SQL export PATH=$ORA_CRS_HOME/bin:$ORA_CRS_HOME/OPatch:$ORA_EXPL_BIN:$PATH if [ `ps -ef | grep -E 'pmon.*\+A' | grep -v grep | cut -d_ -f3- | wc -l` -gt 0 ] ; then export ORACLE_SID=`ps -ef | grep -E 'pmon.*\+A' | grep -v grep | cut -d_ -f3- | sort | tail -1` fi fi ## Accès direct aux logs if [ "$INTERACTIF" = "OUI" ] ; then DRT_LI=`tput lines` else DRT_LI=100 fi ## On teste la présence de fichiers "11" hors ADR. if [ -r $ORA_CRS_HOME/log/$HOSTNAME_SIMPLE/ohasd/ohasd.log ] ; then ## Configuration ancienne OHASD_LOG=$ORA_CRS_HOME/log/$HOSTNAME_SIMPLE/ohasd/ohasd.log CSSD_LOG=$ORA_CRS_HOME/log/$HOSTNAME_SIMPLE/cssd/ocssd.log CRSD_LOG=$ORA_CRS_HOME/log/$HOSTNAME_SIMPLE/crsd/crsd.log ALERT_LOG=$ORA_CRS_HOME/log/$HOSTNAME_SIMPLE/alert$HOSTNAME_SIMPLE.log else ## Configuration nouvelle ADR pour les journaux cluster OB=`ORACLE_HOME=$ORA_CRS_HOME ${ORA_CRS_HOME}/bin/orabase` OHASD_LOG=$OB/diag/crs/$HOSTNAME_SIMPLE/crs/trace/ohasd.trc CSSD_LOG=$OB/diag/crs/$HOSTNAME_SIMPLE/crs/trace/ocssd.trc CRSD_LOG=$OB/diag/crs/$HOSTNAME_SIMPLE/crs/trace/crsd.trc ALERT_LOG=$OB/diag/crs/$HOSTNAME_SIMPLE/crs/trace/alert.log fi ## Cluster Alert log alias alertgen="tail -${DRT_LI}f $ALERT_LOG" ## LOG - OHASD alias ohasd="tail -${DRT_LI}f $OHASD_LOG" ## LOG - CSSD alias cssd="tail -${DRT_LI}f $CSSD_LOG" ## LOG - CRSD alias crsd="tail -${DRT_LI}f $CRSD_LOG" ## Alert global watch ## Aucun intérêt dans un terminal non interactif if [ "$INTERACTIF" = "OUI" ] ; then DRT_LI=`expr $DRT_LI / 10 - 1` DRT_LI2=`expr $DRT_LI \* 3` DRT_LI6=`expr $DRT_LI \* 6` NORMAL=$(tput sgr0) ROUGE=$(tput setaf 1) alias alert="while :; do clear ; R=\`tput cols\` ; echo -e \"${ROUGE}ALERT********${NORMAL}\" ; tail -$DRT_LI $ALERT_LOG | cut -c -\$R ; echo -e \"${ROUGE}CRSD*********${NORMAL}\" ; tail -$DRT_LI2 $CRSD_LOG | cut -c -\$R ; echo -e \"${ROUGE}OCSSD********${NORMAL}\" ; tail -$DRT_LI6 $CSSD_LOG | cut -c -\$R ; echo -e \"${ROUGE}OHASD********${NORMAL}\" ; tail -$DRT_LI $OHASD_LOG | cut -c -\$R ; sleep 1; done" fi else decho GI non installee ORA_CRS_CLUSTERMODE=sa fi # Alias CDT valable pour tous environnements # Attention, cluster ou non. if [ "$ORA_CRS_CLUSTERMODE" = "rst" -o "$ORA_CRS_CLUSTERMODE" = "sa" ] ; then # Sans GI ou en Restart if [ $USER = "SED_ORACLE_TARGET__" ] ; then alias cdt='cd $ORACLE_BASE/diag/rdbms/`echo $ORACLE_SID | tr [:upper:] [:lower:]`/$ORACLE_SID/trace' elif [ $USER = "SED_GRID_TARGET__" ] ; then alias cdt='cd $ORACLE_BASE/diag/asm/`echo $ORACLE_SID | tr [:upper:] [:lower:]`/$ORACLE_SID/trace' fi elif [ ! -z "$ORA_CRS_CLUSTERMODE" ] ; then # En cluster, donc if [ $USER = "SED_ORACLE_TARGET__" ] ; then alias cdt='cd $ORACLE_BASE/diag/rdbms/`echo ${ORACLE_SID%?} | tr [:upper:] [:lower:]`/$ORACLE_SID/trace' elif [ $USER = "SED_GRID_TARGET__" ] ; then alias cdt='cd $ORACLE_BASE/diag/asm/`echo ${ORACLE_SID%?} | tr [:upper:] [:lower:]`/$ORACLE_SID/trace' fi else decho "Type cluster non calculé" fi # Env oracle avec ou hors GI if [ $USER = "SED_ORACLE_TARGET__" ] ; then export SQLPATH=$ORA_EXPL_SQL # Si 1 seul OH dans l'inventaire, on set. Non déterminable si GI non cluster (manque le CRS=true pour identifier) if [ `grep ' on change ## Sinon si on est root et couleur ==> on change ## Sinon on est alors forcément oracle. si couleur ==> on change if [ $USER = "SED_GRID_TARGET__" -a $GRID_INV_C -eq 1 ] || [ $USER = "root" -a $ROOT_INV_C -eq 1 ] || [ $ORAC_INV_C -eq 1 -a $USER != "SED_GRID_TARGET__" -a $USER != "root" ] ; then decho Invite en couleur if [ "$ORA_CRS_CLUSTERMODE" = "flex" ] ; then export PS1='[\[$bleu\]\u\[$reset\]@\[$vert\]\h\[$reset\] ($ORA_CRS_CLUSTERMODE $ORA_CRS_CLUSTER_NAME $ORA_CRS_NODE_TYPE:$ORA_CRS_NODE_NUM) \[$rouge\]${TWO_TASK:-$ORACLE_SID}\[$reset\] \W]\$ ' elif [ "$ORA_CRS_CLUSTERMODE" = "std" ] ; then export PS1='[\[$bleu\]\u\[$reset\]@\[$vert\]\h\[$reset\] ($ORA_CRS_CLUSTERMODE $ORA_CRS_CLUSTER_NAME:$ORA_CRS_NODE_NUM) \[$rouge\]${TWO_TASK:-$ORACLE_SID}\[$reset\] \W]\$ ' elif [ "$ORA_CRS_CLUSTERMODE" = "sa" -o "$ORA_CRS_CLUSTERMODE" = "rst" ] ; then export PS1='[\[$bleu\]\u\[$reset\]@\[$vert\]\h\[$reset\] ($ORA_CRS_CLUSTERMODE) \[$rouge\]${TWO_TASK:-$ORACLE_SID}\[$reset\] \W]\$ ' else export PS1='[\[$bleu\]\u\[$reset\]@\[$vert\]\h\[$reset\] \[$rouge\]${TWO_TASK:-$ORACLE_SID}\[$reset\] \W]\$ ' fi fi # Mode eMacs d'édition de ligne par défaut. Possible de passer en mode vi si nécessaire. set -o emacs fi unset charge ajustement_limites decho APP_CTX HOSTNAME_SIMPLE DEBUG OLR_LOC ORA_INVENTORY ORA_INVENTORY_XMLFILE ORA_INVENTORY_CFFILE ORA_USER_HOME ORA_EXPL_DIR ORA_EXPL_BIN ORA_EXPL_SQL ORA_EXPL_TMP DRT_LI DRT_LI2 DRT_LI6 NODE_INFO DB_TARGET DEC_INST ORA_CRS_HOME INTERACTIF