Start-Stop Database & Listener
Oracle 19c Autostart on OEL8/RHEL8 with systemd Listener + DB via dbstart
0) Prereqs (once per host)
- Oracle 19c binaries installed (e.g.,
/u01/app/oracle/product/19.3.0.0.0/dbhome_1
) - OS user/group:
oracle:dba
/etc/oratab
entries end with:Y
and point to the SAME ORACLE_HOME as below, e.g.:
<SID>:/u01/app/oracle/product/19.3.0.0.0/dbhome_1:Y
- (Recommended) Retire old SysV script to avoid conflicts:
sudo mv /etc/init.d/dbora /etc/init.d/dbora.SYSV.bak 2>/dev/null || true sudo find /etc/rc.d -maxdepth 2 -type l -name '*dbora*' -delete
1) Set variables for this host
(Adjust as needed for your environment)
OH=/u01/app/oracle/product/19.3.0.0.0/dbhome_1 MOUNTS="/u01" # add others if used, e.g., "/u01 /u02"
2) Create the Listener unit
Create /etc/systemd/system/oracle-listener.service
sudo tee /etc/systemd/system/oracle-listener.service >/dev/null <<EOF [Unit] Description=Oracle Listener (19c) After=local-fs.target network-online.target Wants=network-online.target RequiresMountsFor=$MOUNTS [Service] Type=oneshot User=oracle Group=dba RemainAfterExit=yes ExecStart=/bin/bash -lc 'export ORACLE_HOME=$OH; export PATH=\$ORACLE_HOME/bin:\$PATH; export TNS_ADMIN=\$ORACLE_HOME/network/admin; exec \$ORACLE_HOME/bin/lsnrctl start' ExecStop=/bin/bash -lc 'export ORACLE_HOME=$OH; export PATH=\$ORACLE_HOME/bin:\$PATH; export TNS_ADMIN=\$ORACLE_HOME/network/admin; exec \$ORACLE_HOME/bin/lsnrctl stop' TimeoutStartSec=300 TimeoutStopSec=60 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF
3) Create the DB unit (dbstart/dbshut)
Create /etc/systemd/system/dbora.service
sudo tee /etc/systemd/system/dbora.service >/dev/null <<EOF [Unit] Description=Oracle DBs via dbstart (19c) After=local-fs.target network-online.target oracle-listener.service Requires=oracle-listener.service RequiresMountsFor=$MOUNTS [Service] Type=oneshot User=oracle Group=dba RemainAfterExit=yes ExecStart=/bin/bash -lc 'export ORACLE_HOME=$OH; export ORATAB=/etc/oratab; export PATH=\$ORACLE_HOME/bin:\$PATH; exec \$ORACLE_HOME/bin/dbstart \$ORACLE_HOME' ExecStop=/bin/bash -lc 'export ORACLE_HOME=$OH; export ORATAB=/etc/oratab; export PATH=\$ORACLE_HOME/bin:\$PATH; exec \$ORACLE_HOME/bin/dbshut \$ORACLE_HOME' # dbstart sometimes returns 1 when it doesn't manage the listener; treat 0/1 as success SuccessExitStatus=0 1 TimeoutStartSec=600 TimeoutStopSec=60 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF
4) Enable, start, verify
sudo systemctl daemon-reload sudo systemctl enable oracle-listener dbora sudo systemctl start oracle-listener dbora systemctl status oracle-listener dbora --no-pager -l
5) Reboot test
sudo reboot # after login: systemctl is-enabled oracle-listener dbora systemctl status oracle-listener dbora --no-pager -l journalctl -b -u oracle-listener -u dbora --no-pager | tail -n 80
Quick troubleshooting
- Units didn’t start at boot?
systemctl is-enabled oracle-listener dbora
systemctl cat dbora
(should show[Install] WantedBy=multi-user.target
)- Ensure no
/etc/init.d/dbora
is taking precedence (Step 0 cleanup).
- Listener fails to start:
- Confirm OH path:
sudo -iu oracle $OH/bin/lsnrctl status || true
- If binary not found, fix OH/ExecStart paths in
oracle-listener.service
.
- Confirm OH path:
- DB skipped by dbstart:
/etc/oratab
line must end with:Y
and the ORACLE_HOME must exactly match$OH
.
- Storage ordering:
- Add all relevant mount points to
RequiresMountsFor=
in both units (e.g.,/u01 /u02 /oradata
).
- Add all relevant mount points to
- Logs:
systemctl status oracle-listener dbora --no-pager -l
journalctl -b -u oracle-listener -u dbora --no-pager | tail -n 120