Todos nos hemos encontrado en un escenario donde no tengamos configurado Oracle Restart o Clusterware, donde tenemos que automatiozar el arranque de las bases de datos mediante scripts.
Hablando claro, caso de Single Instance sobre filesystem o Single Instance no configurada como recurso.

Oracle nos ofrece los scripts dbstart y dbshut para facilitar dicha tarea, que se basa en la configuración que tengamos en /etc/oratab para arrancarlas (/var/opt/oracle/oratab en el caso de Solaris), pudiendo definir cuales queremos que arranquen en el caso de tener varias en el mismo servidor.

Es script dbstart iniciará las bases de datos en modo OPEN, pero y si queremos que abran en modo mount? Por ejemplo teniendo configurada una standby (si no queremos pasar por caja).

Pues fácil, modificando el script propio de Oracle 🙂

Para ello buscaremos en el script $ORACLE_HOME/bin/dbstart el siguiente apartado y moficamos las líneas señaladas por startup mount.

# Starts a Database Instance
startinst() {
# Called programs use same database ID
export ORACLE_SID

# Put $ORACLE_HOME/bin into PATH and export.
PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
# add for bug # 652997
LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
SPFILE=${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora
SPFILE1=${ORACLE_HOME}/dbs/spfile.ora

echo ""
echo "$0: Starting up database \\"$ORACLE_SID\\""
date
echo ""

checkversionmismatch

# See if it is a V6 or V7 database
VERSION=undef
if [ -f $ORACLE_HOME/bin/sqldba ] ; then
SQLDBA=sqldba
VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
/SQL\\*DBA: (Release|Version)/ {split($3, V, ".") ;
print V[1]}'`
case $VERSION in
"6") ;;
*) VERSION="internal" ;;
esac
else
if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
SQLDBA=svrmgrl
VERSION="internal"
else
SQLDBA="sqlplus /nolog"
fi
fi

STATUS=1
if [ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.dbf ] ; then
STATUS="-1"
fi
if [ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.ora ] ; then
STATUS="-1"
fi
pmon=`ps -ef | grep -w "ora_pmon_$ORACLE_SID" | grep -v grep`
if [ "$pmon" != "" ] ; then
STATUS="-1"
$LOGMSG "Warning: ${INST} \\"${ORACLE_SID}\\" already started."
fi

if [ $STATUS -eq -1 ] ; then
$LOGMSG "Warning: ${INST} \\"${ORACLE_SID}\\" possibly left running when system went down (system crash?)."
$LOGMSG "Action: Notify Database Administrator."
case $VERSION in
"6") sqldba "command=shutdown abort" ;;
"internal") $SQLDBA $args <<EOF
connect internal
shutdown abort
EOF
;;
*) $SQLDBA $args <<EOF
connect / as sysdba
shutdown abort
quit
EOF
;;
esac

if [ $? -eq 0 ] ; then
STATUS=1
else
$LOGMSG "Error: ${INST} \\"${ORACLE_SID}\\" NOT started."
fi
fi

if [ $STATUS -eq 1 ] ; then
if [ -e $SPFILE -o -e $SPFILE1 -o -e $PFILE ] ; then
case $VERSION in
"6") sqldba command=startup ;;
"internal") $SQLDBA <<EOF 
connect internal
startup mount <<<<<<<<<<<<<<<<<<<<<---------------------------------
EOF
;;
*) $SQLDBA <<EOF 
connect / as sysdba
startup mount <<<<<<<<<<<<<<<<<<<<<---------------------------------
quit
EOF
;;
esac

Ahora la parte fácil, creación de un script para integrar con la parada y arranque del servidor

cat /etc/init.d/dbora19c

#! /bin/sh
# description: Oracle auto start-stop script.
#
# Set ORACLE_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORACLE_HOME.
#chkconfig: 345 99 03
# description: Start/Stop the Databases...

ORA_HOME=/u01/app/oracle/product/19.5.0/dbhome_pro
ORA_OWNER=oracle

case "$1" in
'start')
# Start the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
# Remove "&" if you don't want startup as a background process.
su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME" &
touch /var/lock/subsys/dbora
;;

'stop')
# Stop the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME" &
rm -f /var/lock/subsys/dbora
;;
esac
Otorgamos los permisos adecuados
chgrp dba /etc/init.d/dbora19c
chmod 750 /etc/init.d/dbora19c
Creamos enlaces simbólicos 
ln -s /etc/init.d/dbora19c /etc/rc.d/rc0.d/K01dbora19c
ln -s /etc/init.d/dbora19c /etc/rc.d/rc3.d/S99dbora19c
ln -s /etc/init.d/dbora19c /etc/rc.d/rc5.d/S99dbora19c

Y finalmente integramos el script  con el arranque/parada del servidor a nivel de SO

[root@servidor ~]# chkconfig --add dbora19c 
[root@servidor ~]# chkconfig --level 345 dbora19c on
[root@servidor ~]# chkconfig --list |grep dbora19c 
Nota: Esta salida muestra sólo servicios SysV y no incluye servicios nativos      
de systemd. Los datos de configuración SysV pueden verse invalidados por       
la configuración nativa de systemd.
 
Si desea una lista de servicios systemd use 'systemctl list-unit-files'.     
Para ver los servicios que se activan para un objetivo concreto use      'systemctl list-dependencies [objetivo]'.

dbora19c        0:desactivado 1:desactivado 2:desactivado 3:activo 4:activo 5:activo 6:desactivado

Ahora solo queda editar el oratab indicando Y, reiniciar el servidor y ver la mágia del autoarranque en modo mount 🙂