oracledba.help
SpecialTopics

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.
  • 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).
  • Logs:
    • systemctl status oracle-listener dbora --no-pager -l
    • journalctl -b -u oracle-listener -u dbora --no-pager | tail -n 120