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/scripts/start_all.sh \
/usr/local/bin/ora_start_all.sh
install -m755 /home/oracle/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.
Hi
Thanks for article.
In first step scripts are created in directory /home/oracle/scripts[…]
But when you install you use /home/oracle/common_scripts/[…]
Please describe difference or fix it.
Hi,
thanks for pointing to the typo error in path. I have corrected it.
best regards