Autostart unter Linux für Oracle 12c

08.
August
2013
Veröffentlicht von: Marco Patzwahl

Wenn Sie mal wieder eine Datenbank unter UNIX aufsetzen, fällt Ihnen bestimmt auf, dass da etwas fehlt.

Die Datenbank lässt sich inzwischen sehr einfach installieren, aber Sie startet nicht automatisch, wenn das Betriebssystem neu gestartet wurde.

Wenn Sie mal wieder eine Datenbank unter UNIX aufsetzen, fällt Ihnen bestimmt auf, dass da etwas fehlt.

Die Datenbank lässt sich inzwischen sehr einfach installieren, aber Sie startet nicht automatisch, wenn das Betriebssystem neu gestartet wurde.

Jetzt gibt es zwar eine Vorlage im Oracle Support (MOS), nur leider ist diese für die DB Version 10.1 geschrieben (Stand August 2013).

Wir haben deswegen mal eine neue Version für Oracle 12c erstellt und unter SLES 11.2 getestet. Bitte testen Sie das Skript auf Ihrer Distributionsversion ausführlich bevor Sie es produktiv einsetzen!

Legen Sie das folgende Shell Skript mit dem Namen dbora in den Pfad /etc/init.d 

Setzen Sie die Ausführungsrechte:

chmod +x /etc/init.d/dbora

Tragen Sie das Shell Skript in den Run Level 3 und 5 mit folgendem Aufruf ein:

chkconfig --add dbora 

Hier begint das Shell Skript dbora:

#! /bin/bash
### BEGIN INIT INFO
# Provides:      dbora
# Required-Start:  $local_fs $network $syslog
# Required-Stop:   $local_fs $syslog
# Default-Start:    3 4 5
# Default-Stop:      3 5
# Short-Description: Start or Stop of Oracle DB Instance
### END INIT INFO
###  This is just sample code, its free to use.
###  It is distributed in the hope that it will be useful to others,
###  but WITHOUT ANY WARRANTY; without even the implied warranty of
###  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
## chmod +x /etc/init.d/dbora
## chkconfig --add dbora             # For Adding
## chkconfig --level 345 dbora on     # Setting Levels (again)
## chkconfig --del dbora             # For Deleting
## chkconfig --list | grep dbora     # For Check
RETVAL=0
DB_EINTRAG_NUM=0
export ORACLE_OWNER="oracle"
ORATAB=/etc/oratab
# Oratab Format: o12c:/u01/app/oracle/product/12.1.0/dbhome_1:N
LOG=$ORACLE_HOME/shutdown.log
db_start_stop(){
cat $ORATAB | awk -F# '{print $1}' | while read LINE
do
  case $LINE in
  \#*)                ;;        #comment-line in oratab
  *)
  if [ ${#LINE} -gt 5 ]; then # Less then 5 Chars can´t be a good entry
  ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
  if [ "$ORACLE_SID" = '*' ] ; then
      # NULL SID - ignore
      ORACLE_SID=""
      continue
  fi
  # Proceed only if last field is 'Y' or 'W'
  if [ "`echo $LINE | awk -F: '{print $NF}' - | cut -d '' -f 1 `" = "Y" ] ; then
    if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
      INST="DB instance"
      export ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
      export ORACLE_SID
      export ORA_NLS10="$ORACLE_HOME/nls/data"
      (( DB_EINTRAG_NUM = DB_EINTRAG_NUM + 1 ))  # Index erhöhen
     
      LOG=$ORACLE_HOME/shutdown.log
      echo "$INST \"$ORACLE_SID\": "
      echo "Logfile: $LOG"
     
      if [ "$db_mode" = 'stop' ]; then  ###### S T O P ######
     
          # Listener behandeln - ABER NUR bei erstem DB-Eintrag
        if [ "${DB_EINTRAG_NUM}" = "1" ]; then 
°            su $ORA_OWNER -mc "$ORACLE_HOME/bin/lsnrctl stop" >> $LOG 2>&1
        fi
       
        (su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/sqlplus -s / as sysdba" <<EOF 
        shutdown immediate
        exit;
EOF
    ) >> $LOG 2>&1 
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -rf /var/lock/subsys/dbora
    elif [ "$db_mode" = 'stop_plus_info' ]; then ###### S T O P + I N F O ######
        su $ORA_OWNER -mc "$ORACLE_HOME/bin/lsnrctl stop" >> $LOG 2>&1
         echo "begin shutdown at `date`"
        (su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/sqlplus -s / as sysdba" <<EOF 
        SELECT SUM(used_ublk) as used_undo_blks FROM v\$transaction; 
        SELECT server as open_sessions,count(*) FROM v\$session WHERE username IS NOT NULL
ROUP BY server; 
        shutdown immediate
        exit;
EOF
    ) 
       echo "finished shutdown at `date`"
       elif [ "$db_mode" = 'status' ]; then ###### S T A T U S ######         
        echo ## Listener:
        su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/lsnrctl status | egrep 'status|LSNRCTL|TNS-'"
        echo ## Instance:
        su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/sqlplus -s / as sysdba" <<EOF 
            COL free_fra_gb FORMAT a14
            COL inst_name     FORMAT a9
            COL vers          NEW_VALUE vers
            COL vers         FORMAT a4
            COL up_hours     FORMAT 99999.99
            COL inv_obj      FORMAT 99999
            WITH v AS (select substr(version,1,instr(version,'.')-1) vers
            from dba_registry
            where comp_id='CATALOG')
            select v.vers,instance_name as inst_name,to_char(startup_time,'DD.MM.YY HH24:MI:SS') as startup_time,
            round((sysdate-startup_time)*24,2) as up_hours , 
            (select count(*) from dba_objects where status<>'VALID') as inv_obj,
            (select round((space_limit-space_used)/1024/1024/1024,2)||' ('||(ROUND(((SPACE_LIMIT-SPACE_USED)*100/SPACE_LIMIT),2))||'%)' 
            from v\$recovery_file_dest) as free_fra_gb
            from v,v\$instance;
           
            EXIT &vers.
EOF
        export ORACLE_VERSION=$?
        if [ $ORACLE_VERSION -lt 12 ]; then  ### Enterprise Manager DB Control
            export ORACLE_UNQNAME=$ORACLE_SID
            $ORACLE_HOME/bin/emctl status dbconsole
        fi
      elif [ "$db_mode" = 'start' ]; then ###### S T A R T ######
        su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/lsnrctl start" >> $LOG 2>&1
        (su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/sqlplus -s / as sysdba" <<EOF 
        startup
        exit;
EOF
    ) >> $LOG 2>&1 
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dbora
      elif [ "$db_mode" = 'start' ]; then ###### S T A R T + I N F O ######
        echo "try to start Instance at `date`"
        su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/lsnrctl start" >> $LOG 2>&1
        (su $ORACLE_OWNER -mc "$ORACLE_HOME/bin/sqlplus -s / as sysdba" <<EOF 
        startup
        exit;
EOF
    ) >> $LOG 2>&1 
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dbora
        [ $RETVAL -eq 0 ] && echo "Instance startet at `date`"
    fi 
    fi
  else
    echo "Instance `echo $LINE | grep ':'  | awk -F: '{print $1}' ` set to N in /etc/oratab"
  fi
fi
  ;;
  esac
done
}
case "$1" in
start)
db_mode=start
echo -n $"Starting Oracle + Listener: "
db_start_stop
;;
start2)
db_mode=start
echo -n $"Starting Oracle + Listener: "
db_start_stop
db_mode=status
db_start_stop
;;
stop)
db_mode=stop
echo -n $"Stopping Oracle + Listener: "
db_start_stop
;;
stop2)
db_mode=stop_plus_info
echo -n $"Stopping Oracle + Listener: "
db_start_stop
;;
status)
db_mode=status
db_start_stop
;;
restart)
echo $"Stopping Oracle + Listener: "
db_mode=stop
db_start_stop
echo cat $"Starting Oracle + Listener: "
db_mode=start
db_start_stop
;;
*)
echo $"Usage: $0 {start|start2|stop|stop2|status|restart}"
echo "start = Start Listener and Instance"
echo "start2 = Start Listener and Instance and show status"
echo "stop = Stop Listener and Instance"
echo "stop2 = Stop Listener and Instance + Show info about open sessions and open transactions
before shutdown"
echo "status = Show Status of Listener and Database (+ Uptime, Invalid Objects, Free Space in Flash Recovery Area)"
echo "restart = Stop and Start Listener and Instance"
echo
echo "(c) 2014 written by Marco Patzwahl MuniQSoft GmbH Unterhaching/Munich,Germany"
echo "without any warranty. Please only use this script after testing in your environment!!!"
exit 1
esac
exit $?

Getestet haben wir derzeit folgende Konfigurationen:

  • SLES 11.2 und Oracle 12.1 (/etc/init.d/functions Aufruf musste auskommentiert werden)
  • Oracle Enterprise Linux 6.4 und Oracle 12.1

>>Dank an Herrn Scheuing für ein paar Verbesserungen im Skript !

Weitere interessante Tipps & Tricks für Oracle unter Linux erhalten Sie in unserem Opens internal link in current windowKurs Linux und Oracle.

Sie benötigen tatkräftige Unterstützung? Unsere Oracle Opens internal link in current windowConsulting- & Support-Mitarbeiter helfen Ihnen gerne weiter.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.