If you are frequently working with the Oracle technology, in most of the cases your Oracle system will run over a Linux machine, for example based on a Red Hat compatible distribution (Red Hat Enterprise, Fedora, or CentOS).
In fact, if your purpose is to test, develop or evaluate a solution based on the Oracle stack, you can freely rely on a virtual machine based on the free Oracle Virtualbox (in case, do NOT forget to install the VirtualBox Guest Additions!), the CentOS distribution, and the Oracle Database Enterprise Edition (or Standard, or even XE - it depending on your purposes).
Unfortunately, by default both Oracle Enterprise and Standard Edition don' t set any startup script in the /etc/init.d/ directory at installation time. No panic: we can create a custom one and manually deploy it.
First of all, we check our /etc/oratab file, whose row follows the following syntax:
istance_sid:oracle_home:[Y|N]
The "oratab" file is automatically created by the Oracle installer, and it's used by the "dbstart" and "dbshut" scripts to figure out which database istances have to be start up or shut down. In particular:
- istance_sid: System ID (SID) of the desired oracle instance;
- oracle_home: ORACLE_HOME directory associated to the specified istance;
- [Y|N] simply indicates if the istance should automatically start at boot time (Y="yes", N="no").
Obvioulsy, we set as "Y" every database instance we wanna automatically to be started at boot time.
For example, a production /etc/oratab file could look like something like this:
orcl:/opt/oracle/product/11.2.0/dbhome_1:N
dev:/opt/oracle/product/11.2.0/dbhome_1:Y
test:/opt/oracle/product/11.2.0/dbhome_1:Y
prod:/opt/oracle/product/11.2.0/dbhome_1:Y
Now we can create our new init script. We create a new, empty file called "oradb" and we add the following lines:
#!/bin/sh
# chkconfig: 345 20 80
# description: counter daemon
# processname: counter
# /etc/rc.d/init.d/oracle
# Description: Automatically starts and stops the Oracle database and the listeners.
Note: the line "# chkconfig: 345 20 80" is absolutely necessary to make the script compatible with the Red Hat service management subsystem and should not be skipped!
The following code implements the "body" of our init script:
case "$1" in
start)
echo -n "Starting Oracle Databases: "
echo "----------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Starting Oracle Databases as part of system up." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
su - oracle -c dbstart $ORACLE_HOME >> /var/log/oracle
echo "...done."
echo -n "Starting Oracle Listeners: "
su - oracle -c "lsnrctl start" >> /var/log/oracle
echo "...done."
echo ""
echo "----------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
touch /var/lock/subsys/oracle
;;
stop)
echo -n "Shutting Down Oracle Listeners: "
echo "----------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Shutting Down Oracle Databases as part of system down." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
su - oracle -c "lsnrctl stop" >> /var/log/oracle
echo "...done."
rm -f /var/lock/subsys/oracle
echo -n "Shutting Down Oracle Databases: "
su - oracle -c dbshut $ORACLE_HOME >> /var/log/oracle
echo "...done."
echo ""
echo "----------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
;;
restart)
echo -n "Restarting Oracle Databases: "
echo "---------i-------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Restarting Oracle Databases as part of system up." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
su - oracle -c dbshut $ORACLE_HOME >> /var/log/oracle
su - oracle -c dbstart $ORACLE_HOME >> /var/log/oracle
echo "...done."
echo -n "Restarting Oracle Listeners: "
su - oracle -c "lsnrctl stop" >> /var/log/oracle
su - oracle -c "lsnrctl start" >> /var/log/oracle
echo "...done."
echo ""
echo "----------------------------------------------------" >> /var/log/oracle
date +"! %T %a %D : Finished." >> /var/log/oracle
echo "----------------------------------------------------" >> /var/log/oracle
touch /var/lock/subsys/oracle
;;
*)
echo "Usage: oracle {start|stop|restart}"
exit 1
esac
As you may notice, we make use of the Oracle standard "dbstart" ("dbshut") and "lsnrctl" utilities.
Note: in order to make this script correctly work, the "dbstart", "dbshut" and "lsnrctl" utilites must be present in the PATH environmental variable! You can check it by typing the command:
# env | grep PATH
If the PATH environmental variable is not correctly set up, you can manually do it using:
# PATH:$PATH:oracle_utils_path; export PATH
You can locate the utilities using the command:
# updatebd; locate dbstart
or
# find / -name dbstart
Adding this line to the /etc/profile file will make the correct PATH variable also available at boot time.
Now you must deploy the script in the /etc/init.d/ directory. The script should be own by the "root" user:
# chown root:root /etc/init.d/oradb
and should be granted with the "775" permission:
# chmod 775 /etc/init.d/oradb
Eventually, to make Oracle automatically start at boot time type:
# chkconfig --add oradb
Restart your system, set the ORACLE_SID to your database SID name, and test the script it via SQLPLUS, TOAD, or SQL Developer. You can (as root) also manually call the script:
- # /etc/init.d/oradb start: to make the database istances start;
- # /etc/init.d/oradb stop: to make them stop;
- # /etc/init.d/oradb restart: to make them restart.
No comments:
Post a Comment