Benutzer-Werkzeuge

Webseiten-Werkzeuge


comp:saprc
Übersetzungen dieser Seite?:

SAP will nicht starten

…und zwar aus Gründen, die vermutlich am Betriebssystem liegen? Genau das lag bei einem neu installierten SAP Solution Manager (DB: Oracle 10.2.0.2, OS: SUSE Linux Enterprise Server 10, Architektur: Linux x86_64) vor…

Der SAP-Support teilte mir mit, dass das Problem aus einem Namenskonfikt zwischen dem Novell-Paket „sapinit“ und dem SAP-Systemscript „startsapserv“ resultiere. Workaround bis zur Freigabe eines geänderten „sapinit“ sei es, das Paket ganz zu deinstallieren.

Naja, wenn es weiter nichts ist… :-( Aber schließlich sollte die Software bei einem Rechnerstart automatisch starten, also habe ich ein eigenes rc-Script geschrieben:

#! /bin/bash
#
# /etc/init.d/mysap
#
#   and its symbolic link
#
# /usr/sbin/rcmysap
#
### BEGIN INIT INFO
# Provides:       MYSAP
# Required-Start: $remote_fs $syslog
# Should-Start:   sysstat
# Required-Stop:  $remote_fs $syslog
# Default-Start:  3 5
# Default-Stop:   0 1 2 6
# Short-Description:    Control script for SAP systems
# Description:    Starts and stops SAP systems on this machine, provides status statistics
### END INIT INFO
 
# Fetch the boot script functions, if available
test -f /etc/rc.status && . /etc/rc.status
 
# get configuration data
CONFIGFILE=/etc/sysconfig/mysap
test -f $CONFIGFILE && . $CONFIGFILE
 
# Reset status of this service
rc_reset
 
# Figure out what to do, and do it ;-)
case "$1" in
    start)
        for SAPSID in $MYSAP_SYSTEMS; do
            # set some variables, 
            # SAP system ID in upper and lower case letters
            SIDBIG=$(echo $SAPSID | tr /a-z/ /A-Z/)
            SIDSML=$(echo $SAPSID | tr /A-Z/ /a-z/)
            # and the SAP sidadm:
            SIDADM="${SIDSML}adm"
            # if requested, start the Oracle database first
            case $MYSAP_ORASID in
                *${SAPSID}*)
                    # the Oracle user:
                    ORASID="ora${SIDSML}"
                    # first start the Oracle listener as Oracle user
                    su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl start"
                    # now start the SAP system as SAP user
                    su - $SIDADM -c "/sapmnt/$SIDBIG/exe/startsap"
                    ;;
                *)
                    # start the SAP system, not the DB
                    su - $SIDADM -c "/sapmnt/$SIDBIG/exe/startsap r3"
                    ;;
            esac
        done
        rc_status -v
        ;;
    stop)
        for SAPSID in $MYSAP_SYSTEMS; do
            # set some variables, 
            # SAP system ID in upper and lower case letters
            SIDBIG=$(echo $SAPSID | tr /a-z/ /A-Z/)
            SIDSML=$(echo $SAPSID | tr /A-Z/ /a-z/)
            # and the SAP sidadm:
            SIDADM="${SIDSML}adm"
            # if requested, the DB is shutdown too:
            case $MYSAP_ORASID in
                *${SAPSID}*)
                    # stop the complete SAP system
                    su - $SIDADM -c "/sapmnt/$SIDBIG/exe/stopsap"
                    # find the system's Oracle user
                    ORASID="ora${SIDSML}"
                    # stop the database listener
                    su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl stop"
                    ;;
                *)
                    # stop the SAP system only
                    su - $SIDADM -c "/sapmnt/$SIDBIG/exe/stopsap r3"
                    ;;
            esac
        done
        rc_status -v
        ;;
    status)
        for SAPSID in $MYSAP_SYSTEMS; do
            SIDBIG=$(echo $SAPSID | tr /a-z/ /A-Z/)
            SAPPROCS=$(ps ax | grep "dw.sap$SIDBIG" | grep -v grep | wc -l)
            ORAPROCS=$(ps ax | grep "oracle$SIDBIG" | grep -v grep | wc -l)
            JVAPROCS=$(ps ax | grep jlaunch | grep $SIDBIG | grep -v grep | wc -l)
            ICMPROCS=$(ps ax | grep icman | grep $SIDBIG | grep -v grep | wc -l)
            SSSPROCS=$(ps ax | grep sapstartsrv | grep $SIDBIG | grep -v grep | wc -l)
            echo -n "Processes: System $SIDBIG: $SAPPROCS d+w, $ORAPROCS Oracle, "
            echo    "$JVAPROCS Java, $ICMPROCS ICM, $SSSPROCS sapstartserv"
        done
        rc_status -v
        ;;
    try-restart|restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|status|stop|restart|try-restart}"
        exit 1
        ;;
esac
rc_exit

Zum Abschluss noch ein

ln -s /etc/init.d/mysap /usr/sbin/rcmysap
insserv mysap

und die Sache funktioniert!

Ach ja, die Konfigurationsdatei /etc/sysconfig/mysap sieht so aus:

## Path:        Productivity/Other
## Description: Parameters for SAP software on this machine
## Config:      mysap
#
# This file defines some parameters.
#
# There are no default values, since they highly depend on the
# individual system.
#
 
## Type:                string
## Default:             ""
## Config:              ""
#
# the SAP systems to be controlled. Multiple systems separated by space.
# for example MYSAP_SYSTEMS="C11 UFO THX"
#
MYSAP_SYSTEMS="SID"
 
## Type:                string
## Default:             ""
## Config:              ""
#
# the Oracle databases "under" the SAP systems to be controlled. Multiple
# databases may be given separated by space. On a standalone server, 
# MYSAP_ORASID should be the same as MYSAP_SYSTEMS.
# for example MYSAP_SYSTEMS="C11 UFO"
#
MYSAP_ORASID="SID"

Nach den gerade gemachten Erfahrungen muss ich ergänzen: es klappt fast immer. Es klappt immer dann, wenn der zu startende Oracle-Listener den Namen LISTENER hat. Hat er ihn nicht, muss er mit angegeben werden. In diesem Fall wären zwei Zeilen im Script zu ändern, sie müssen um den Namen des Listeners ergänzt werden. Beispielsweise würde aus

su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl stop"

ein

su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl stop LISTENER${SIDBIG}"

und ebenso aus

su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl start"

das entsprechende

su - $ORASID -c "/oracle/$SIDBIG/102_64/bin/lsnrctl start LISTENER${SIDBIG}"

Entscheidend ist der Name des Listeners, wie er in /oracle/$SIDBIG/102_64/network/admin/listener.ora vermerkt ist1). Das Gemeine ist, dass der Listener auch ohne den Parameter startet und mit lsnrctl status meldet, dass die DB läuft – aber sie läuft auf einem anderen Port, was ein Hinweis darauf ist, dass die Konfiguration nicht (vollständig) gelesen wurde.

1)
im gegebenen Fall hieß der Listener LISTENER${SIDBIG}
comp/saprc.txt · Zuletzt geändert: 2010-12-09 1425 von werner