Skip to Main Content

Breadcrumb

DB Startup unter Systemd

Oracle Datenbank Startup Scripts für Systemd Systeme

Lange Zeit waren wir gewohnt, Scripts zum Startup der Oracle Services in /etc/init.d abzulegen und mit symbolischen links (bzw. chkconfig) dafür zu sorgen, dass diese beim Start/Stop des Servers ausgeführt werden. Mit systemd sieht die Welt leider etwas anders aus - zum Glück für einige Oracle Produkte funktioniert der "alte Weg" aktuell noch. Die Frage ist nur, wie lange noch.

Hier ein Beispiel, wie man mit Systemd Startup/Shutdown Scripts implementieren kann.

Die benötigten Scripts unter dem Benutzer Oracle

Startup und Shutdown Scripts im Oracle Benutzer

Zuerst braucht man Shell Scripts, die die gewünschten Services starten und stoppen können - unser Beispiel kümmert sich nur um das Starten/Stoppen der Oracle Datenbanken und Listener.

Die Scripts legen wir im Verzeichnis /home/oracle/scripts ab. ORACLE_HOME liegt unter /u01/app/oracle/product/12.2.0/dbhome_ee.

start_all.sh
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_ee
$ORACLE_HOME/bin/dbstart $ORACLE_HOME

stop_all.sh
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_ee
$ORACLE_HOME/bin/dbshut $ORACLE_HOME

Jetzt nur noch die Fileprotection korrekt setzen - als Benutzer Oracle:

chmod 750 $HOME/scripts/st*_all.sh

Zusätzlich muss sichergestellt werden, dass in /etc/oratab am Ende des Datenbankeintrags ein "Y" steht - hier ein Beispiel dafür:

# Demo /etc/oratab
db122ee:/u01/app/oracle/product/12.2.0/dbhome_ee:Y
db122se:/u01/app/oracle/product/12.2.0/dbhome_se:Y

Damit sind die Scripts für den Start/Stop der Datenbanken fertig.

Systemd Service anlegen - Beispiel für Filesysteme (SAN, HDD,...)

Dieses Beispiel ist "as simple as possible" - mehr muss es gar nicht sein. Wenn Sie zusätzlich zu den Oracle Datenbanken noch weitere Oracle Produkte auf dem Server betreiben (Grid Control, WebServer,...) empfehlen wir, entsprechend eigene Services zu bauen.

Legen Sie das File bitte als /lib/systemd/system/dbora.service an.

[Unit]
Description=Oracle Datenbank Service
# Einzige Abhaengigkeit - das Netzwerk muss laufen.
After=syslog.target network.target

[Service]
# systemd ignoriert bis pam-1.1.5-5.fc15 die PAM limits - gegebenenfalles muessen diese manuell gesetzt werden
# https://bugzilla.redhat.com/show_bug.cgi?id=754285
LimitMEMLOCK=infinity
LimitNOFILE=6553500
TimeoutStopSec=5min

#Type=simple
RemainAfterExit=yes
User=oracle
Group=oinstall
ExecStart=/home/oracle/scripts/start_all.sh
ExecStop=/home/oracle/scripts/stop_all.sh

[Install]
WantedBy=multi-user.target

Systemd Service anlegen für Datenbanken auf NFS

Wenn die Datenbank NFS benutzt, darf der Startup erst erfolgen, wenn NFS läuft. Das erreicht man mit zusätzlichen Abhängigkeiten.

[Unit]
Description=Oracle Datenbank Service
#Abhaengigkeiten fuer NFS
Requires=rpc-statd.service network.target nfs.service nfs-mountd.service local-fs.target remote-fs.target
After=syslog.target network.target nfs.service nfs-mountd.service local-fs.target rpc-statd.service remote-fs.target

[Service]
# systemd ignoriert bis pam-1.1.5-5.fc15 die PAM limits - gegebenenfalles muessen diese manuell gesetzt werden
# https://bugzilla.redhat.com/show_bug.cgi?id=754285
LimitMEMLOCK=infinity
LimitNOFILE=6553500
TimeoutStopSec=5min

#Type=simple
RemainAfterExit=yes
User=oracle
Group=oinstall
ExecStart=/home/oracle/scripts/start_all.sh
ExecStop=/home/oracle/scripts/stop_all.sh

[Install]
WantedBy=multi-user.target

Das dbora.service in Systemd einhängen - als root

Nachdem wir nun alle Scripts beieinander haben, müssen wir diese nur noch systemd korrekt bekannt manchen.

Zuerst das dbora.service bekannt machen:

# systemctl daemon-reload

Hinweis: Nach jeder Änderung an einem Service Script müssen Sie den "daemon-reload" wiederholen.

Danach die Datenbanken mittels systemctl starten:

# systemctl start dbora.service

Wenn diese erfolgreich starten, kann man das Service für den nächsten Reboot einhängen:

# systemctl enable dbora.service

Und natürlich kann man sich auch ansehen, ob alles läuft:

# systemctl status dbora.service

dbora.service - Oracle Datenbank Service
Loaded: loaded (/usr/lib/systemd/system/dbora.service; enabled; vendor preset: disabled)
Active: active (exited) since Tue 2018-05-15 16:59:33 EDT; 1min 32s ago
Process: 4658 ExecStop=/home/oracle/scripts/stop_all.sh (code=exited, status=0/SUCCESS)
Process: 7747 ExecStart=/home/oracle/scripts/start_all.sh (code=exited, status=0/SUCCESS)
Main PID: 7747 (code=exited, status=0/SUCCESS)
... hier kommt dann noch eine Liste der gestarteten Prozesse ...

Und natürlich kann man das Service auch wieder stoppen:

$ systemctl stop dbora.service

Einschränkung

Das Beispiel funktioniert nicht mit Passwort geschützten Listenern und/oder Wallet Konfigurationen. Wenn Sie solche haben, wenden Sie sich bitte an uns, wie helfen Ihnen gerne weiter.