Oracle Datenbank und PDBs über systemd steuern

Neben klassischen Datenbanken lassen sich in Oracle auch Container Datenbanken mit einzelnen PDBs (Pluggable Database) betreiben. Diese kommen gerade im Cloud Business oder in mandantenfähigen Umgebungen zum Einsatz. Allerdings ist das Starten bzw. Stoppen der PDBs über einen systemd Dienst gar nicht so einfach und bedarf ein wenig „Jugend forscht“, bis es dann endlich mal so funktioniert, wie man sich das auch vorstellt. In diesem Blog möchte ich zeigen, was alles getan werden muss, dass neben der Container Datenbank auch die PDBs im Schreib/Lese Modus zur Verfügung stehen, ohne dass dieser Modus manuell über SQLPlus gesetzt werden muss.


Oracle liefert bereits zwei Befehle zum Starten und Stoppen der Datenbank mit. Das sind „dbstart“ und „dbshut“. Der Befehl„dbstart“ zieht auch gleich den Listener mit nach Oben, falls dieser noch nicht gestartet ist. In einer Default Umgebung passiert erstmal aber auch nichts weiter. Damit die Datenbank auch automatisch gestartet werden kann, muss dies über eine Konfigurationsdatei geregelt werden.

sudo nano /etc/oratab

Dazu muss das letzte Zeichen des Eintags von “N” auf “Y” geändert werden.

Oracle systemd Container PDB
Jetzt wird die Container Datenbank auch automatisch gestartet, sobald “dbstart” ausgeführt wird. Allerdings bleiben dann die PDBs im Status „mounted“ und können so nicht verwendet werden. Damit der Schreib/Lese Modus automatisch gesetzt wird, kann ein Datenbank Trigger angelegt werden, der dies automatisch übernimmt, sobald die Container Datenbank gestartet wird. Realisiert wird das über „sqlplus“. Dazu wird eine Verbindung als „sysdba“ aufgebaut.

connect / as sysdba

Um den Trigger anzulegen, werden folgende Zeilen hinzugefügt.

CREATE OR REPLACE TRIGGER autostart_pdbs
AFTER STARTUP ON DATABASE 
BEGIN 
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN'; 
END;
/

Der Status wird auch im Terminal entsprechen quittiert. Nun kann auch der eigentliche systemd Dienst angelegt werden, der die ganze Aktion für die Zukunft automatisiert.

sudo nano /etc/systemd/system/oracle_db.service
[Unit]
Description=Oracle Database 12.1.0.2
After=syslog.target network.target
 
[Service]
LimitMEMLOCK=infinity
LimitNOFILE=65535
#Type=simple
RemainAfterExit=yes
User=oracle
Group=oinstall
Environment="ORACLE_HOME=/home/oracle/app/oracle/product/12.1.0/dbhome_1"
ExecStart=/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/dbstart $ORACLE_HOME >> 2>&1 &
ExecStop=/home/oracle/app/oracle/product/12.1.0/dbhome_1/bin/dbshut $ORACLE_HOME 2>&1 &
 
[Install]
WantedBy=multi-user.target

Der Dienst muss gestartet und aktiviert werden, damit auch bei einem Neustart des Systems die Datenbank automatisch gestartet wird.

Dienst aktivieren:

sudo systemctl enable oracle_db.service

Dienst starten:

sudo systemctl start oracle_db.service

Dienst stoppen:

sudo systemctl stop oracle_db.service

Die Ergebnisse können auch über sqlplus getestet werden, indem der Status der PDBs abgefragt wird.

connect / as sysdba
show pdbs

Oracle systemd Container PDB

Ab jetzt werden die Komponenten Listener, Container Datenbank und PDBs automatisch durch den systemd Dienst gestartet.