[Pacemaker] Oracle 10g Express edition OCF cluster script

Ladislav Jech archenroot at gmail.com
Tue Jan 18 10:02:56 EST 2011


Hi,

it's already some time ago, when was asked to configure cluster for
Oracle Database 10g Express Edition. The included scripts for oracle in
repository didn't work well, so I created my own script and while
playing with pacemaker and corosync application blocks and communicating
with Andrew Beekhof he told me to share this script with community.

The script is still not finished. There are details which schould be
done more preciously, but it is works. If someone want to test it and
use it, please don't hesitate and let me know about what could be done
in better way.

Hope it will help someone.

The script itself>
#!/bin/sh
#
#
#       Oracle Database Express OCF RA.
#
# Copyright (c) 2010 Ladislav Jech
#                    All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
##############################
#########################################
# Initialization:

: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
# . /usr/lib/ocf/resource.d/heartbeat/.ocf-shellfuncs
# Set up oracle environment variables
. /ip/oracle/scripts/oracle_env.sh


#######################################################################

meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="oracle-db-express" version="1.1">
<version>1.0</version>

<longdesc lang="en">
This is resource agent used explicitly for Oracle Database Express 10g
instead of currently implemented 2 agents delivered with Pacemaker.
</longdesc>
<shortdesc lang="en">Oracle Database Express agent</shortdesc>

<parameters>
<parameter name="state" unique="1">
<longdesc lang="en">
Location to store the resource state in.
</longdesc>
<shortdesc lang="en">State file</shortdesc>
<content type="string"
default="${HA_VARRUN}/{OCF_RESOURCE_INSTANCE}.state" />
</parameter>
</parameters>

<actions>
<action name="start"          timeout="90" />
<action name="stop"           timeout="100" />
<action name="monitor"        timeout="20" interval="10" depth="0"
start-delay="30" />
<action name="meta-data"      timeout="5" />
<action name="validate-all"   timeout="30" />
</actions>
</resource-agent>
END
}
#######################################################################

# don't exit on TERM, to test that lrmd makes sure that we do exit
trap sigterm_handler TERM
sigterm_handler() {
       ocf_log info "They use TERM to bring us down. No such luck."
       return
}
oracle_usage() {
       cat <<END
usage: $0 {start|stop|monitor|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.
END
}
#######################################################################
#       ORACLE START UP
#ca
oracle_start() {
       su -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/bin/sqlplus -s /nolog @
$ORACLE_HOME/config/scripts/startdb.sql"
       su -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start"
       return $OCF_SUCCESS

}
#######################################################################
#       ORACLE SHUTDOWN
#
oracle_stop() {
       su -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/bin/sqlplus -s /nolog @
$ORACLE_HOME/config/scripts/stopdb.sql"
       su -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
       return $OCF_SUCCESS
}
####################################################################
#       ORACLE MONITORING
#
oracle_monitor() {
       # Monitor _MUST!_ differentiate correctly between running
       # (SUCCESS), failed (ERROR) or _cleanly_ stopped (NOT RUNNING).
       # That is THREE states, not just yes/no.
       pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | grep -v grep`
       # !!! Here schould appear also the check for running listener !!!
       if [ "$pmon" != "" ]; then
               return $OCF_SUCCESS
       else
               return $OCF_NOT_RUNNING
       fi
       if false ; then
               return $OCF_ERR_GENERIC
       fi
}
oracle_validate() {
   # Is the state directory writable?
   state_dir=`dirname "$OCF_RESKEY_state"`
   touch "$state_dir/$$"
   if [ $? != 0 ]; then
       return $OCF_ERR_ARGS
   fi
   rm "$state_dir/$$"

   return $OCF_SUCCESS
}
: ${OCF_RESKEY_CRM_meta_interval=0}
: ${OCF_RESKEY_CRM_meta_globally_unique:="true"}

if [ "x$OCF_RESKEY_state" = "x" ]; then
   if [ ${OCF_RESKEY_CRM_meta_globally_unique} = "false" ]; then
       state="${HA_VARRUN}/${OCF_RESOURCE_INSTANCE}.state"

       # Strip off the trailing clone marker
       OCF_RESKEY_state=`echo $state | sed s/:[0-9][0-9]*\.state/.state/`
   else
       OCF_RESKEY_state="${HA_VARRUN}/${OCF_RESOURCE_INSTANCE}.state"
   fi
fi

case $__OCF_ACTION in
meta-data)
               meta_data
               exit $OCF_SUCCESS
               ;;
start)
               oracle_start
               ;;
stop)
               oracle_stop
               ;;
monitor)
               oracle_monitor
               ;;
validate-all)
               oracle_validate
               ;;
usage|help)
               oracle_usage
               exit $OCF_SUCCESS
               ;;
*)
               oracle_usage
               exit $OCF_ERR_UNIMPLEMENTED
               ;;
esac
rc=$?
ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
exit $rc

Let me know about your proposals to enhance this.

Best regards,




More information about the Pacemaker mailing list