DB Startup unter Systemd und SELinux enforcing

Oracle Datenbank Startup Scripts für Systemd Systeme

Bis vor kurzem war bei der Oracle Datenbank Installation eine der Anforderungen SELinux zu deaktivieren bzw. auf permissive zu stellen. Das ist vor einiger Zeit gefallen und in der Installationsanleitung nicht mehr als Anforderung definiert.

Um nun dafür zu sorgen, dass die Oracle Instanzen auf einem Server auch mit SELinux auf enforcing automatisch gestartet werden, muss man wissen, dass SELinux das Starten von System Services nicht aus Benutzer Home Verzeichnissen erlaubt.

Hier ein Beispiel, wie man mit Systemd Startup/Shutdown Scripts implementieren kann, wenn SELinux auf enforcing gesetzt wird.

Wie gewohnt brauchen wir die Shell Scripts, die die gewünschten Services starten und stoppen können. Das 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/19.0.0/dbhome_1.

cat >> /home/oracle/scripts/start_all.sh <<EOF
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
$ORACLE_HOME/bin/dbstart $ORACLE_HOME
EOF

cat >> /home/oracle/scripts/stop_all.sh <<EOF
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
$ORACLE_HOME/bin/dbshut $ORACLE_HOME
EOF

Diese Scripts müssen nun als User root in ein für das Starten von System Services erlaubtes Verzeichnis installiert werden.

sudo -i

install -m755 /home/oracle/common_scripts/start_all.sh   \
        /usr/local/bin/ora_start_all.sh

install -m755 /home/oracle/common_scripts/stop_all.sh   \
        /usr/local/bin/ora_stop_all.sh

exit

Es empfiehlt sich, diese Scripts nur im Home-Verzeichnis des Oracle Benutzers zu warten und danach mit dem install entsprechend neu zu installieren.

Zusätzlich muss sichergestellt werden, dass in /etc/oratab am Ende des Datenbankeintrags ein Y steht:

cat >> /etc/oratab <<EOF
db19cee:/u01/app/oracle/product/19.0.0/dbhome_1:Y
EOF

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,…) wollen, bitte entsprechend eigene Services bauen.

Legen Sie folgenden Datei als root als /lib/systemd/system/dbora.service an.

cat >> /lib/systemd/system/dbora.service <<EOF
[Unit]
Description=Oracle Datenbank Service
# Abhaengigkeiten - das Netzwerk muss laufen und die Laufwerke eingehaengt.
After=rsyslog.target network.target local-fs.target

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

#Type=simple
RemainAfterExit=yes
User=oracle
Group=oinstall
ExecStart=/usr/local/bin/ora_start_all.sh
ExecStop=/usr/local/bin/ora_stop_all.sh

[Install]
WantedBy=multi-user.target
EOF

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.

cat >> /lib/systemd/system/dbora.service <<EOF
[Unit]
Description=Oracle Datenbank Service
#Abhaengigkeiten fuer NFS
Requires=rpc-statd.service network.target local-fs.target remote-fs.target
After=rsyslog.target network.target local-fs.target rpc-statd.service remote-fs.target
 
[Service]
# systemd ignoriert bis pam-1.1.5-5.fc15 die PAM limits - gegebenenfalles manuell setzen
# https://bugzilla.redhat.com/show_bug.cgi?id=754285
LimitMEMLOCK=infinity
LimitNOFILE=6553500
TimeoutStopSec=5min
 
#Type=simple
RemainAfterExit=yes
User=oracle
Group=oinstall
ExecStart=/usr/local/bin/ora_start_all.sh
ExecStop=/usr/local/bin/ora_stop_all.sh
 
[Install]
WantedBy=multi-user.target
EOF

Service mit systemd aktivieren

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

systemctl daemon-reload

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

Jetzt 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 2023-8-21 15:56:37 CEST; 1h 21min ago
  Process: 1172 ExecStart=/usr/local/bin/ora_start_all.sh (code=exited, status=0/SUCCESS)
 Main PID: 1172 (code=exited, status=0/SUCCESS)
    Tasks: 65 (limit: 50458)
   Memory: 5.2G
   CGroup: /system.slice/dbora.service
           ├─1248 /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr LISTENER -inherit
           ├─1314 ora_pmon_db19cee
... 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. Hier kann ich Ihnen gerne weiter helfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This site uses Akismet to reduce spam. Learn how your comment data is processed.