Démarrage automatique d'oracle
Résolu
nouhoun
Messages postés
25
Date d'inscription
Statut
Membre
Dernière intervention
-
dmganges -
dmganges -
A voir également:
- Démarrage automatique d'oracle
- Forcer demarrage pc - Guide
- Ordinateur lent au démarrage - Guide
- Réponse automatique thunderbird - Guide
- Reinitialiser pc au demarrage - Guide
- Demarrage automatique - Guide
6 réponses
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 !
@+
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 !
@+
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
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
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.
@+
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.
@+
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 :))
@+
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 :))
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question