Configuring automatic startup of Oracle Database under systemd on RHEL 7/OEL 7/CentOS 7
There are several methods how to start Oracle Database automatically during/after OS boot. You can use Oracle CRS, other clusterware or init implemented in Linux. Starting RHEL 7 SysV init has been replaced by systemd or simply said systemd is the new init system.
In these days not only group of Linux users became polarized but also whole Linux world became polarized as well. Mostly Redhat based distributions have adopted systemd, other distributions are reluctant to implement systemd and either are continuing to use SysV init or migrated to another solutions e.g. Upstart. Despite this fact most of the Oracle certified Linux distributions (such as Redhat or SuSE and their (even not certified) clones) are using the systemd.
This post briefly shows how to configure systemd service for automatic start of Oracle Databases and Listener and these steps are applicable for Redhat Enterprise Linux 7, Oracle Enterprise Linux 7, CentOS 7 or SuSE Linux Enteprise Server 12 and Fedora 15 (or later).
Typically systemd startup configuration consists of two parts:
- unit file - using ".service" suffix (in case of service), typically stored in /usr/lib/systemd/system or /etc/systemd/system directory for units provided by installed packages or /usr/lib/systemd/user or /etc/systemd/user directory for units installed by administrator
- environment file (optional) - typically stored in /etc/sysconfig directory on RHEL and it's clones. We don't need it in our case.
Creating the unit for automatic startup/shutdown of Oracle Database manually
Logon as root user create and edit /etc/systemd/system/oracle-rdbms.service and add following content:
# /etc/systemd/system/oracle-rdbms.service
# Invoking Oracle scripts to start/shutdown Instances defined in /etc/oratab
# and starts Listener
[Unit]
Description=Oracle Database(s) and Listener
Requires=network.target
[Service]
Type=forking
Restart=no
ExecStart=/opt/oracle/12102/bin/dbstart /opt/oracle/12102
ExecStop=/opt/oracle/12102/bin/dbshut /opt/oracle/12102
User=oracle
[Install]
WantedBy=multi-user.target
Note that this configuration assumes that our ORACLE_HOME is /opt/oracle/12102. It's recommended to use PIDFile while using "forking" type but we don't need it. As you can see well known scripts (shipped with Oracle Database) are executed for startup/shutdown using path to Oracle Home in order to specify the Oracle Home for Listener process. As shown these scripts are executed under "oracle" user account/privileges. More over service can be started once network is cofigured (started) and service starts in multi-user level (more less equivalent of runlevel 3 in SysV init)
Now we have to reload systemd in order to register unit file (as root) and enable the service.
systemctl daemon-reload
systemctl enable oracle-rdbms
So, now the startup service should be created and enabled but to be sure we can check it by following command (Note: first line is OS command, other lines is the output):
systemctl status oracle-rdbms
oracle-rdbms.service - Oracle Database(s) and Listener
Loaded: loaded (/etc/systemd/system/oracle-rdbms.service; enabled)
According to output our service is enabled succesfully and should be started on next OS boot. To start the service without reboot of machine you can use following command:
systemctl start oracle-rdbms
Creating the unit for automatic startup/shutdown of Oracle Database using script
I have created a simple script which automatically performs above tasks for creating and enabling startup service. This scripts contains simple checks (as I've tried to make the script bulletproof), then lists available Oracle homes that exist on OS and then asks to specify Oracle home from which the Listener will be started. Note that it's important to specify Oracle home for the highest version of Oracle software as Listener will be handling connections for all Oracle homes.
#!/usr/bin/bash
# This script configures systemd startup service for Oracle Databases and Listener
# Ivan Kartik http://ivan.kartik.sk
if [ `whoami` != "root" ]; then
echo "root login required!"
exit
fi
if [ `uname -s` != "Linux" ]; then
echo "This is not Linux!"
exit
fi
if [ `ps -e|grep " 1 ?"|cut -d " " -f15` != "systemd" ]; then
echo "Systemd is not present, use Init scripts instead!"
exit
fi
echo "List of existing Oracle Homes:"
echo "------------------------------"
cat `cat /etc/oraInst.loc|grep inventory_loc|cut -d '=' -f2`/ContentsXML/inventory.xml|grep "HOME NAME"|cut -d '"' -f 4
echo
echo "Enter ORACLE_HOME of Oracle Listener [$ORACLE_HOME]:"
read NEWHOME
case "$NEWHOME" in
"") ORAHOME="$ORACLE_HOME" ;;
*) ORAHOME="$NEWHOME" ;;
esac
if [ -z $ORAHOME ]; then
echo "Error: Missing value!"
exit
fi
if [ -f $ORAHOME/bin/lsnrctl ]; then
echo '# /etc/systemd/system/oracle-rdbms.service
# Ivan Kartik http://ivan.kartik.sk
# Invoking Oracle scripts to start/shutdown Instances defined in /etc/oratab
# and starts Listener
[Unit]
Description=Oracle Database(s) and Listener
Requires=network.target
[Service]
Type=forking
Restart=no
ExecStart='$ORAHOME'/bin/dbstart '$ORAHOME'
ExecStop='$ORAHOME'/bin/dbshut '$ORAHOME'
User=oracle
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/oracle-rdbms.service
systemctl daemon-reload
systemctl enable oracle-rdbms
echo "Done! Service oracle-ordbms has been configured and will be started during next boot."
echo "If you want to start service now, execute: systemctl start oracle-rdbms"
else
echo "Error: No Listener script under specified ORACLE_HOME: $ORAHOME"
exit
fi
You either can copy/paste this code or download here: http://ivan.kartik.sk/scripts/oracle_systemd_service.sh
Final check of service and started databases (Note: Output from systemctl status has been shortened):
# cat /etc/oratab |grep :Y
ORA12CR1:/opt/oracle/12102:Y
ORA11GR2:/opt/oracle/11204:Y
# systemctl status oracle-rdbms
oracle-rdbms.service - Oracle Database(s) and Listener
Loaded: loaded (/etc/systemd/system/oracle-rdbms.service; enabled)
Active: active (running) since Mon 2015-11-15 14:51:13 CET; 54s ago
Process: 425 ExecStart=/opt/oracle/12102/bin/dbstart /opt/oracle/12102 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/oracle-rdbms.service
├─ 452 /opt/oracle/12102/bin/tnslsnr LISTENER -inherit
├─1155 ora_pmon_ORA12CR1
├─1171 ora_vktm_ORA12CR1
├─1177 ora_gen0_ORA12CR1
├─1181 ora_mman_ORA12CR1
├─1183 ora_diag_ORA12CR1
├─1185 ora_dbrm_ORA12CR1
├─1195 ora_ckpt_ORA12CR1
├─1197 ora_smon_ORA12CR1
├─1199 ora_reco_ORA12CR1
├─1201 ora_lreg_ORA12CR1
├─1289 ora_mman_ORA11GR2
.....
├─1291 ora_dbw0_ORA11GR2
├─1293 ora_lgwr_ORA11GR2
├─1295 ora_ckpt_ORA11GR2
├─1297 ora_smon_ORA11GR2
├─1299 ora_reco_ORA11GR2
├─1301 ora_mmon_ORA11GR2
├─1303 ora_mmnl_ORA11GR2
├─1350 ora_qmnc_ORA11GR2
└─1450 ora_q001_ORA11GR2
Nov 15 14:50:57 oel01 dbstart[425]: Processing Database instance "ORA12CR1": log file /opt/oracle/12102/startup.log
Nov 15 14:51:07 oel01 dbstart[425]: Processing Database instance "ORA11GR2": log file /opt/oracle/11204/startup.log
Nov 15 14:51:13 oel01 systemd[1]: Started Oracle Database(s) and Listener.
For little comparison of difference commands or usage regarding SysV init and systemd, here is very nice cheat sheet created by guys from Linoxide.com it's downloadable here: http://images.linoxide.com/systemd-vs-sysVinit-cheatsheet.pdf
Systemd Homepage: http://www.freedesktop.org/wiki/Software/systemd/