Démarrage automatique d'oracle

Résolu
nouhoun Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
 dmganges -
Bonjour,

j'ai installé oracle 10g sur une dbian4
j'ai fait le script /etc/init.d/oracle pour démarrer et arrêter automatiquement oracle comme un service. voici le contenu du script

#!/bin/sh
# description: Script de demarrage d'oracle

RETVAL=0
prog="oracle"

export ORACLE_BASE=/oracle/u01/app/oracle
export ORACLE_HOME=/oracle/u01/app/oracle/product
export ORACLE_SID=orcl #bdtest étant le nom de votre base de donnée
export ORACLE_TERM=xterm
export PATH=/oracle/u01/app/oracle/product/bin:/usr/sbin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export ORATAB=/etc/oratab
export ORACLE_HOME_LISTENER=$ORACLE_HOME

case "$1" in
start)
echo -n "Demarrage de ORACLE (assez long)"
sudo -u oracle /oracle/u01/app/oracle/product/bin/lsnrctl start >/dev/null 2>&1
sudo -u oracle /oracle/u01/app/oracle/product/bin/dbstart >/dev/null 2>&1
sudo -u oracle /oracle/u01/app/oracle/product/bin/isqlplusctl start" >/dev/null 2>&1
sudo -u oracle /oracle/u01/app/oracle/product/bin/emctl start dbconsole" >/dev/null 2>&1

RETVAL=$?
echo
[ $RETVAL -ne 0 ] && echo "ERREUR - DEMARRAGE NON EFFECTUE"
[ $RETVAL -eq 0 ] && echo "SUCCES - DEMARRAGE SANS PROBLEME"
echo
;;

stop)
echo -n "Arret de ORACLE (assez long): "
sudo -u oracle /oracle/u01/app/oracle/product/bin/lsnrctl stop >/dev/null 2>&1
sudo -u oracle /oracle/u01/app/oracle/product/bin/dbshut >/dev/null 2>&1
RETVAL=$?
echo
[ $RETVAL -ne 0 ] && echo "ERREUR - ARRET NON EFFECTUE"
[ $RETVAL -eq 0 ] && echo "SUCCES - ARRET SANS PROBLEME"
echo
;;
restart)
$0 stop
sleep 5
$0 start
;;

*)
echo "Utilisation: /etc/init.d/oracle {start|stop|restart}" >&2
exit 2
;;

esac

quand je lance la machine, il est bien affiché 'demarrage d'oracle sans probleme' mais après vérification, c'est isqlplus seul qui est lancé. Je suis donc obligé de lancer les autres manuellement.
qu'est-ce que je dois faire?
A voir également:

6 réponses

dmganges
 
Bjr,
Cela fait longtemps que je n'ai pas fait d'Oracle (9i)

Mais comme personne ne répond...

Première chose bête, t'es-tu assuré que les fermetures se font correctement et qu'il n'y a pas de fichier lock quelque part... Pardon je ne me souviens plus du nom exact... du type SID_lock, je crois.

Deuxième, j'avais fait un script semblable, et qui fonctionnait...
Il me semble que j'avais dû supprimer les ">/dev/null 2>&1"
Dans ces cas le système lance simultanément tous les scripts, puisqu'il y a redirection des messages... (cela revient à faire un nohup dbstart &) sans attendre les démarrages effectifs (surtout celui de dbstart), et çà Oracle n'aime pas, à ma souvenance seul lsnrctl pouvait être démarrer alors qu'aucune instance de base ne tournait.

Comme je démarrais plusieurs instances sur la même machine, j'avais été amené à ajouter un petit "sleep 2" entre chaque instance.

Bien sûr cela ralenti le boot de la machine, car on a le prompt "root" seulement lorsque la (les) bases sont démarrées !
et les messages de démarrages Oracle apparaissent sur la console système !
En cas de plantage de la machine, et donc recovery d'Oracle ça peut effectivement prendre beaucoup de temps !

@+
0
nouhoun Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
j'ai suprimé les ">/dev/null 2>&1"
et voilà ce qu'il me met "ORACLE_HOME_LISTNER is not set unable to auto-start oracle net,listener"
envirement variable ORACLE_SID not defined. please define it

et pourtant ces variable sont bel et bien definies
0
dmganges
 
Bjr,
J'ai fait qq recherches dans mes archives.
En gros dans le script de démarrage, il faut faire appel au script svrmgrl d'Oracle... s'il existe dans ta version, ou l'équivalent...

Cela revient a réaliser le démarrage de cette façon :

export ORACLE_SID=$1
svrmgrl << EOF
connect internal
startup
EOF

Où $1 est le SID passé en paramètre.
Je te fais un copier coller du script que j'avais réalisé.
Je te laisse le simplifier, en effet celui-ci démarrait plusieurs bases sur des machines en cluster disques et en parallèle serveur. j'avais était amené à modifier le script initial svrmgrl d'Oracle et j'avais remplacé /etc/oratab par /etc/oraduf pour prendre en compte toutes les variables environnement nécessaire à cette configuration.

Globalement si tu ajoutes les lignes ci-dessus à ton script après avoir exporté les variables env Oracle çà doit être bon !

Le Script :

#
# $Header: dbstart.sh.pp 1.1 95/02/22 14:37:29 rdhoopar Osd<unix> $ dbstart.sh.pp Copyr (c) 1991 Oracle
#
# Modifi�par Dufour pour prendre en compte :
# - le fonctionnement en cluster
# - les bases en parralel server
#
# Attention le fichier /etc/oraduf a ��modifi�en cons�unece
#
###################################
#
# usage: dbstart
#
# This script is used to start ORACLE from /etc/rc(.local).
# It should ONLY be executed as part of the system boot procedure.
#
#####################################
if test -f /etc/local/oracr ; then
cp /dev/null /etc/local/oracr
fi
ORATAB=/etc/oraduf
integer status=0

case $ORACLE_TRACE in
T) set -x ;;
esac

# Set path if path not set (if called from /etc/rc)
case $PATH in
"") PATH=/bin:/usr/bin:/etc
export PATH ;;
esac

#
# Loop for every entry in oraduf file and and try to start
# that ORACLE
#
MAC3=`uname -n | cut -c-3`
CENOEUD=`uname -n`
if [ "$CENOEUD" = 'gaspard' ] ; then
AUTRENOEUD=`echo melchior`

fi
if [ "$CENOEUD" = 'melchior' ] ; then
AUTRENOEUD=`echo gaspard`
fi
cat $ORATAB | while read LINE
do
status=0
case $LINE in
\#*) ;; #comment-line in oraduf
*)
# La base doit-elle tourner sur ce noeud
if [ "`echo $LINE | awk -F: '{print $4}' -`" = "$MAC3" ] ; then
AVAL='1'
else
AVAL='0'
fi
# La base doit-elle tourner en parallel server
if [ "`echo $LINE | awk -F: '{print $5}' -`" = "PARA" ] ; then
PARA="parallel"
else
PARA=""
fi
# R�up�ation du fichier init.ora qui convient
PFL=`echo $LINE | awk -F: '{print $6}' -`
PFILE=${ORACLE_HOME}/dbs/$PFL
# Faut-il d�arrer la base et r�up�ation de l'ORACLE_SID
if [ "`echo $LINE | awk -F: '{print $3}' -`" = "Y" ] ; then
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
else
ORACLE_SID=""
fi
export ORACLE_SID
# R�up�ation de l'ORACLE_HOME (d�init la version utilis�)
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/etc ; export PATH
# La base tourne-t-elle d��
if test -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.dbf ; then
EXIST="1"
else
EXIST="0"
fi
# La base tourne-t-elle sur ce noeud

SID=ora_pmon_$ORACLE_SID
set `echo $SID`
if [ "`ps -ef | grep -v awk | awk /$1/ -`" ] ; then
TRN="1"
else
TRN="0"
fi

if [ "$ORACLE_SID" = "" ] ; then
continue;
fi
if [ "$ORACLE_SID" != "" ] ; then
status=`expr $status + 16`
fi
if [ "$AVAL" = "1" ] ; then
status=`expr $status + 8`
fi
if [ "$PARA" = "parallel" ] ; then
status=`expr $status + 4`
fi
if [ "$EXIST" = "1" ] ; then
status=`expr $status + 2`
fi
if [ "$TRN" = "1" ] ; then
status=`expr $status + 1`
fi
#echo
#echo ORA=$ORACLE_SID PARA=$PARA AVAL=$AVAL EXIST=$EXIST TRN=$TRN PFL=$PFL - $status

sleep 3
case $status in
0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15 )
echo ""
echo "\t Cas < 16 :"
echo "\t Pour info $ORACLE_SID invalid�dans $ORATAB - $LINE"
echo ""
;;

16|17|18|19|20|21|22|23 )
echo ""
echo "\t 16 <= Cas <= 23 :"
echo "\t Pour info $ORACLE_SID doit tourner sur $AUTRENOEUD"
echo ""
;;

25|29 )
echo ""
echo "\t Cas = 25 ou 29 : ATTENTION ANOMALIE"
echo "\t Cas r�ut�impossible (EXIT=0 et TRN=1) Pour $ORACLE_SID"
echo ""
;;

26 )
echo ""
echo "\t Cas = 26 :"
echo "\t Pour info $ORACLE_SID doit tourner en MONO sur $AUTRENOEUD"
echo ""
;;

27 )
echo ""
echo "\t Cas = 27 :"
echo "\t Cas impossible au boot de la machine"
echo "\t Pour info $ORACLE_SID tourne d��en MONO sur $CENOEUD"
echo ""
;;

31 )
echo ""
echo "\t Cas = 31 :"
echo "\t Pour info $ORACLE_SID tourne d��en PARA sur $CENOEUD"
echo ""
;;

24|28|30 )

if [ "$status" = "24" ] ; then
echo ""
echo "\t Cas = 24 :"
echo "\t D�arrage de $ORACLE_SID en MONO sur $CENOEUD"
echo ""
svrmgrl_RefOra << EOF
connect internal
startup PFILE=$PFILE
EOF
if test $? -eq 0 ; then
echo ""
echo "D�arrage Base $ORACLE_SID OK"
echo "D�arrage Base $ORACLE_SID OK" >> /etc/local/oracr
else
echo ""
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID"
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID" >> /etc/local/oracr
fi

fi
if [ "$status" = "28" ] ; then
echo ""
echo "\t Cas = 28 :"
echo "\t D�arrage de $ORACLE_SID en PARA sur $CENOEUD"
echo ""
svrmgrl_RefOra << EOF
connect internal
startup parallel PFILE=$PFILE
EOF
if test $? -eq 0 ; then
echo ""
echo "D�arrage Base $ORACLE_SID OK"
echo "D�arrage Base $ORACLE_SID OK" >> /etc/local/oracr
else
echo ""
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID"
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID" >> /etc/local/oracr
fi

fi
if [ "$status" = "30" ] ; then
echo ""
echo "\t Cas = 30 :"
echo "\t Pour info $ORACLE_SID tourne en PARA sur $AUTRENOEUD"
echo "\t D�arrage de $ORACLE_SID en PARA sur $CENOEUD"
echo ""
svrmgrl_RefOra << EOF
connect internal
startup parallel PFILE=$PFILE
EOF
if test $? -eq 0 ; then
echo ""
echo "D�arrage Base $ORACLE_SID OK"
echo "D�arrage Base $ORACLE_SID OK" >> /etc/local/oracr
else
echo ""
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID"
echo "ATTENTION anomalie dans D�arrage Base $ORACLE_SID" >> /etc/local/oracr
fi

fi
;;
esac
;;
esac
done

echo ""
echo "\t R�apitulatif des messages Oracle"
echo ""
cat /etc/local/oracr
echo ""
ps -ef | grep ora_pmon | grep -v grep
sleep 4

===============================
Pardon pour les caractères accentués qui ne passent pas !
===============================

La boucle principale :
cat $ORATAB | while read LINE

permet de récupérer les variables oracle de /etc/oraduf pour toi /etc/oratab pour chaque base à démarrer...
ensuite ce ne sont que des tests et positionnement de variables pour cet environnement très spécifique.
La séquence de démarrage corrspond au cas 24 pour toi (Base simple (et non en parallele serveur qui doit tourner sur cette machine (Noeud) et non une autre) :

if [ "$status" = "24" ] ; then
echo ""
echo "\t Cas = 24 :"
echo "\t D�arrage de $ORACLE_SID en MONO sur $CENOEUD"
echo ""
svrmgrl_RefOra << EOF
connect internal
startup PFILE=$PFILE
EOF

Tu remarqueras au passage, qu'il n'est pas possible de respecter les indentations.
En effet les lignes svrmgrl, connect internal et startup doivent impérativement commencer au caractère 0.

svrmgrl_RefOra est le script original d'Oracle svrmgrl.

Le Listner et autres nouveaux services peuvent être démarrés comme tu le fais.

Ceci dit, je suis étonné, normalement en faisant les liens entre /etc/init.d... /etc/rc.d/rcN.d et dbstart/dbstop d'Oracle
ça devrait marcher !

Bon, en espérant que ceci te soit utile.
Bienvenue dans le monde merveilleux d'Oracle.
@+
0
dmganges
 
En fait, j'ai dû être trop bavard, il suffisait de commencer par là !
cp /oracle/u01/app/oracle/product/bin/dbstart /etc/init.d/oracle

ça devrait suffire, puisque tu as déjà fait les liens avec /etc/rc.d/rcN.d

Fais une save avant :)

Une petite remarque :
Dans tes scripts de démarrage de service, inutile de mettre sudo, tu es déjà en root !

Grande remarque :
Lorsqu'on en est à administrer Oracle, on est assez grand(e) pour travailler sous root directement,
sudo c'est pour les neuneux, et puis çà fait des scripts INCOMPATIBLES Unix :))

@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nouhoun Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Merci

j'ai enlevé les 'sudo -n' et je les ai remplacés par 'su' et ça marche

merci pour votre disponibilité
0
dmganges
 
Merci du retour d'info.
Il est en effet important de démarrer les process Oracle en tant qu'oracle pour ne pas avoir de pb d'accès par la suite...
0