Skip to Main Content

Oracle Database Express Edition (XE)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Bug in /etc/init.d/oracle-xe script - proposed solution

522277Jan 6 2009 — edited Jan 11 2009
Hi,
I found out that, under CentOS (RHEL clone), Oracle XE starts up normally at system boot, but does not shut down cleanly at system shutdown. The system just reboots, ignoring Oracle XE, with a real possibility of datafile corruption. Not good.
I investigated the issue and found the root cause: the /etc/init.d/oracle-xe script does not create the necessary lock files in the /var/lock/subsys directory. I changed the script, and now it works correctly - Oracle XE shuts down gracefully during system shutdown.
Here goes the modified script. Regards,

Georger
#!/bin/bash 
#
#
# chkconfig: 2345 80 05
# description: This is a program that is responsible for taking care of
# configuring the Oracle Database 10g Express Edition and its associated 
# services. 
#
# processname: oracle-xe 
# Red Hat or SuSE config: /etc/sysconfig/oracle-xe
# Debian or Ubuntu config: /etc/default/oracle-xe
#
# change log:
#	svaggu 09/28/05 -  Creation
#	svaggu 11/08/05 -  Source function Library change for SuSE
#	svaggu 11/09/05 -  Password validation is added
#	jlbec  11/22/05 -  Debianization
#	svaggu 12/02/05 -  Errors messages are updated
#	svaggu 12/14/05 -  Anonymous is removed from password message prompt and
#			   changing the password for anonymous user logic is also
#			   removed			    
#	svaggu 12/12/05 -  Password validation is modified
#	georger 01/05/09 -  Create and remove lock files at system startup/shutdown
#                       in order to have the system automatically shut down Oracle
#                       during system shutdown
#

# Source fuction library
if [ -f /lib/lsb/init-functions ]
then
	. /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]
then
	. /etc/init.d/functions
fi

# Set path if path not set (if called from /etc/rc)
case $PATH in
    "") PATH=/bin:/usr/bin:/sbin:/etc
        export PATH ;;
esac

# Save LD_LIBRARY_PATH
SAVE_LLP=$LD_LIBRARY_PATH

RETVAL=0
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
ORACLE_OWNER=oracle
ORACLE_SID=XE
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
SU=/bin/su
export ORACLE_HOME
export ORACLE_SID
export PATH=$ORACLE_HOME/bin:$PATH
LOG="$ORACLE_HOME_LISTNER/listener.log"

export LC_ALL=C

if [ $(id -u) != "0" ]
then
    echo "You must be root to run the configure script.  Login as root and then run the 
configure script."
    exit 1
fi

CONFIG_NAME=oracle-xe
CONFIGURATION="/etc/sysconfig/$CONFIG_NAME"
if [ -f /etc/redhat-release ]
then
    . /etc/init.d/functions

    init_status()
    {
	return 0
    }
    exit_status()
    {
	exit $?
    }
    success_status()
    {
	success
	echo
    }
    failure_status()
    {
	failure $?
	echo
    }

elif [ -f /etc/SuSE-release ]
then
    . /etc/rc.status

    init_status()
    {
	rc_reset
    }
    success_status()
    {
	echo "OK"
	return 0
    }
    failure_status()
    {
	echo "Failed"
	return 1
    }
    exit_status()
    {
	exit $?
    }

else
    if [ -d /etc/default ]
    then
        CONFIGURATION="/etc/default/$CONFIG_NAME"
    fi

    init_status()
    {
        return 0
    }

    success_status()
    {
        echo "OK"
        return 0
    }

    failure_status()
    {
        echo "Failed"
        return 0
    }

    exit_status()
    {
        exit $?
    }
fi

# Source configuration

[ -f "$CONFIGURATION" ] && . "$CONFIGURATION"

init_status

#
# if_fail()
#
# Evaluates return codes.  If 0, prints "OK", if 1, prints "Failed"
# and exits.  If 2, status is "already done" and nothing is printed.
# The rest of the functions in here all honor this convention.
#
if_fail()
{
    RC="$1"
    REASON="$2"
    if [ "$RC" = "0" ]
    then
        return
    elif [ "$RC" = "2" ]
    then
        return
    fi
    failure_status "${REASON}"
    exit 1
}


#
# write_sysconfig()
#
# Writes the system configuration
#
write_sysconfig()
{
	cat >"$CONFIGURATION" <<EOF
    
#This is a configuration file for automatic starting of the Oracle
#Database and listener at system startup.It is generated By running
#'/etc/init.d/oracle-xe configure'.Please use that method to modify this 
#file

# ORACLE_DBENABLED:'true' means to load the Database at system boot.
ORACLE_DBENABLED=${ORACLE_DBENABLED:-false}

# LISTENER_PORT: Database listener
LISTENER_PORT=${LISTENER_PORT}

# HTTP_PORT : HTTP port for Oracle Application Express
HTTP_PORT=${HTTP_PORT}

# Configuration : Check whether configure has been done or not
CONFIGURE_RUN=${CONFIGURE_RUN}

EOF
	
    if [ $? != 0 ]
	then
		return 1
	fi
	return 0
}

# configure_perform()
#
# Instantantiate listener.ora,tnsnames.ora,and create the database,
# sets the password,start the listener,and adds database to inittab
# if necessary

configure_perform()
{
    sed -i "s/%hostname%/`hostname`/g" $ORACLE_HOME/network/admin/listener.ora
    sed -i "s/%port%/$LISTENER_PORT/g" $ORACLE_HOME/network/admin/listener.ora
    /bin/chown oracle:dba $ORACLE_HOME/network/admin/listener.ora

    sed -i "s/%hostname%/`hostname`/g" $ORACLE_HOME/network/admin/tnsnames.ora
    sed -i "s/%port%/$LISTENER_PORT/g" $ORACLE_HOME/network/admin/tnsnames.ora
    /bin/chown oracle:dba $ORACLE_HOME/network/admin/tnsnames.ora

    sed -i "s/%httpport%/$HTTP_PORT/g" $ORACLE_HOME/config/scripts/postDBCreation.sql
    /bin/chown oracle:dba $ORACLE_HOME/config/scripts/postDBCreation.sql

    if test $LISTENER_PORT -ne 1521
    then
	if [ -f /tmp/local_listener ]
	then
	cat >/tmp/local_listener$$ <<EOF
###########################################
# Registration of instance with listsner
###########################################
local_listener="(ADDRESS = (PROTOCOL=TCP) (HOST=%hostname%) (PORT=%port%))"
EOF
	/bin/chmod 664 /tmp/local_listener$$
	cat /tmp/local_listener$$ >> $ORACLE_HOME/config/scripts/init.ora
	else
	cat >/tmp/local_listener <<EOF
###########################################
# Registration of instance with listsner
###########################################
local_listener="(ADDRESS = (PROTOCOL=TCP) (HOST=%hostname%) (PORT=%port%))"
EOF
	/bin/chmod 664 /tmp/local_listener
	cat /tmp/local_listener >> $ORACLE_HOME/config/scripts/init.ora
	fi

	if test -f /tmp/local_listener
	then
		rm -fr /tmp/local_listener
	elif test -f /tmp/local_listener$$
	then
		rm -fr /tmp/local_listener$$
	fi
	
	sed -i "s/%port%/$LISTENER_PORT/g" $ORACLE_HOME/config/scripts/init.ora
	sed -i "s/%hostname%/`hostname`/g" $ORACLE_HOME/config/scripts/init.ora
        /bin/chown oracle:dba $ORACLE_HOME/config/scripts/init.ora

    fi

    sed -i "s/%httpport%/$HTTP_PORT/g" $ORACLE_HOME/config/scripts/DatabaseHomePage.sh
    /bin/chown oracle:dba $ORACLE_HOME/config/scripts/DatabaseHomePage.sh

    sed -i "s/%httpport%/$HTTP_PORT/g" $ORACLE_HOME/config/scripts/readonlinehelp.sh
    /bin/chown oracle:dba $ORACLE_HOME/config/scripts/readonlinehelp.sh

    homedir=`echo $HOME`
    if [ "$homedir" = "/root" ]
    then
        homedir=`sh -c "echo ~$USER"`
    fi

    if [ -f $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop ]  
    then
    	    /bin/chown oracle:dba $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop
    	    /bin/chmod 664  $homedir/.gnome-desktop/oraclexe-gettingstarteddesktop.desktop
    fi
    if [ -f $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop ]
    then
	/bin/chown oracle:dba $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop
	/bin/chmod 664  $homedir/Desktop/oraclexe-gettingstarteddesktop.desktop
    fi

    if [ -f $ORACLE_HOME/bin/tnslsnr ]  
    then
     	echo -n "Starting Oracle Net Listener..."
       	$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR  start" > /dev/null 2>&1
       	touch /var/lock/subsys/listener
	echo "Done"
    fi

    echo -n "Configuring Database..."
    $SU -s /bin/bash $ORACLE_OWNER -c "$ORACLE_HOME/config/scripts/XE.sh" > /dev/null 2>&1
    err=`grep "ORA-44410" $ORACLE_HOME/config/log/*.log`
    if test "$err" != ""
    then
	echo "Database Configuration failed.  Look into $ORACLE_HOME/config/log for details"
	exit 1
    fi
    echo  alter user sys identified by \"$ORACLE_PASSWORD\"\; | $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s / as sysdba" > /dev/null 2>&1
 echo  alter user system identified by \"$ORACLE_PASSWORD\"\; | $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s / as sysdba" > /dev/null 2>&1
    echo "Done"

    /bin/chmod -R 640 /usr/lib/oracle/xe/oradata/XE
    /bin/chmod 750 /usr/lib/oracle/xe/oradata/XE
     rm -fr $ORACLE_HOME/config/seeddb 

    if [ -f /etc/oratab ]
    then
	echo "XE:$ORACLE_HOME:N" >> /etc/oratab
    else
   	echo "XE:$ORACLE_HOME:N" >> /etc/oratab
	/bin/chown oracle:dba /etc/oratab
	/bin/chmod 644 /etc/oratab
    fi
    
   echo -n "Starting Oracle Database 10g Express Edition Instance..."
   pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | grep -v grep`

   if [ "$pmon" = "" ];
   then
	   $SU -s /bin/bash  $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" > /dev/null 2>&1
	   touch /var/lock/subsys/oracle-xe
   fi
   echo "Done"

   echo "Installation Completed Successfully."

	
   return 0
}

#
#configure_ask()
#
# Ask configuration questions,setting the variables.
#

configure_ask()
{
	cat <<EOF

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express 
Edition.  The following questions will determine whether the database should 
be starting upon system boot, the ports it will use, and the passwords that 
will be used for database accounts.  Press <Enter> to accept the defaults. 
Ctrl-C will abort.

EOF

    #get the http port value
	while :
	do
	    while [ 1 ]
	    do
            echo -n Specify the HTTP port that will be used for Oracle Application Express [8080]:
            read LINE
            if [ -z $LINE ]
            then
                LINE=8080
            fi
            port=`netstat -n --tcp --listen | grep :$LINE | awk '{print $4}' | cut -d':' -f2`
            if [ "$port" = "$LINE" ]
            then
                echo Port $port appears to be in use by another application.\
                Please specify a different port.
            else
                break;
            fi
        done

	    case "$LINE" in
	    "")
            break
            ;;
        *[^0-9]*)
            echo "Invalid http port: $LINE"
            ;;
        *)
            HTTP_PORT=$LINE
            break
            ;;
	    esac
	done
    
    #get the listener port value
	while : 
	do
        echo 
        while [ 1 ]
        do
            echo -n Specify a port that will be used for the database listener [1521]:
            read LINE
            if [ -z $LINE ]
            then
                LINE=1521
            fi
            echo
            port=`netstat -n --tcp --listen | grep :$LINE | awk '{print $4}' | cut -d':' -f2`
            if [ "$port" = "$LINE" ]
            then	
                echo Port $port appears to be in use by another application.\
                Please specify a different port.
            else
                break;
            fi
        done
	          
        case "$LINE" in
        "")
            break
            ;;
        *[^0-9]*)
            echo "Invalid port: $LINE" >&2
            ;;
	    *) 
            	if [ "$HTTP_PORT" != "$LINE" ]
	        then
        	    LISTENER_PORT=$LINE
                    break
	        else
        	    echo Database listener cannot be configured on the same port as Oracle Application Express.
	        fi
            ;;
	    esac
	done
    
    #get the database password
	    while :
	    do
	    echo -n "Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after 
initial configuration:"
	   while [ 1 ]
	   do
	     /bin/stty -echo > /dev/null 2>&1
	     temp=`echo $IFS`
             export IFS="\n"	
	     while [ 1 ]
  	     do
	     read LINE
             while [ -z "$LINE" ]
	     do
		 echo
		 echo -n "Password can't be null. Enter password:"  
	         read LINE
	     done

	     result=`expr index "$LINE" [\'\"]`
	     if [ $result != 0 ];
	     then
             	echo 
	        echo -n "The password you entered contains invalid characters. Enter password:"	
	     else
		break
	     fi
	     done
		echo
		echo -n "Confirm the password:"
	        read LINE1
		echo
                if [ "$LINE" != "$LINE1" ];
		then
			echo    
			echo -n "Passwords do not match.  Enter the password:"
		else
			break
		fi
	done
            /bin/stty echo > /dev/null 2>&1
            ORACLE_PASSWORD=$LINE
	    export IFS=$temp
            break;
	done

	while :
	do
        if [ "$ORACLE_DBENABLED" = "true" ]
        then
            CUR=y
        else
            CUR=n
        fi
	echo
        echo -n "Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:"
        read LINE
	if [ -z $LINE ]
	then
		ORACLE_DBENABLED=true
	fi
        echo
        case "$LINE" in
        "") 
            break
            ;;
        y|Y)
            ORACLE_DBENABLED=true
            break
            ;;
        n|N)
            ORACLE_DBENABLED=false
            break
            ;;
        *)
            echo "Invalid response: $LINE " >&2
            break
        esac
	done
}

configure()
{
	if test -f "$CONFIGURATION"
	then
		echo "Oracle Database 10g Express Edition is already configured"
	exit 1
	fi
	configure_ask
	configure_perform
	CONFIGURE_RUN=true
	write_sysconfig
	echo To access the Database Home Page go to \"http://127.0.0.1:$HTTP_PORT/apex\"
        
}

start() {

	if [ "$CONFIGURE_RUN" != "true" ]		
	then
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
		exit 0
	fi
	status=`ps -ef | grep tns | grep oracle`
	if [ "$status" == "" ]
	then
		if [ -f $ORACLE_HOME/bin/tnslsnr ]  
	        then
		     	echo "Starting Oracle Net Listener."
        		$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR  start" > /dev/null 2>&1
        		touch /var/lock/subsys/listener
		fi
	fi
	echo "Starting Oracle Database 10g Express Edition Instance."
	$SU -s /bin/bash  $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" > /dev/null 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ]
    then
        echo
        touch /var/lock/subsys/oracle-xe
    else
        echo Failed to start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr\
 	      and Oracle Express Database using $ORACLE_HOME/bin/sqlplus.
        RETVAL=1
    fi
    return $RETVAL
}

stop() {
	if [ "$CONFIGURE_RUN" != "true" ]               
    then
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
        exit 0
    fi
    
    # Stop Oracle 10g Express Edition Database and Listener
    echo Shutting down Oracle Database 10g Express Edition Instance.
	$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/stopdb.sql" > /dev/null 2>&1
	echo Stopping Oracle Net Listener.
    $SU -s /bin/bash  $ORACLE_OWNER -c "$LSNR stop" > /dev/null 2>&1
    RETVAL=$?
    echo 
    if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/listener
    then
        rm -f /var/lock/subsys/oracle-xe
        return $RETVAL
    fi
}

dostatus() {
	if test ! -f "$CONFIGURATION"
    then	
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
        exit 0
	elif [ "$CONFIGURE_RUN" != "true" ]
    then
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
        exit 0
    fi
        
	$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR status"
    RETVAL=$?
}

# See how we were called
case "$1" in
  start)
	if test -f "$CONFIGURATION"
	then
	        if test "$ORACLE_DBENABLED" != "true" 
        	then
			exit 0
	        fi
	else
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
		exit 0
	fi
	start
       ;;
  configure)
        configure
        ;;
  stop)
	if test -f "$CONFIGURATION"
	then
	        if test "$ORACLE_DBENABLED" != "true" 
        	then
			exit 0
	        fi
	else
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
		exit 0
        fi
	stop
        ;;
  restart|reload|force-reload)
        stop
        start
        RETVAL=$?
        ;;
  status)
        dostatus
        ;;
  enable) 
	if test -f "$CONFIGURATION"
	then
        	ORACLE_DBENABLED=true
	        write_sysconfig
	else
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
	exit 0
	fi
        ;;

  disable)
	if test -f "$CONFIGURATION"
	then
        	ORACLE_DBENABLED=false
	        write_sysconfig
	else
	echo "Oracle Database 10g Express Edition is not configured.  You must run
'/etc/init.d/oracle-xe configure' as the root user to configure the database."
	exit 0
	fi
	;;

	*)
        echo $"Usage: $0 {start|stop|restart|force-reload|configure|status|enable|disable}"
        exit 1
esac
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 8 2009
Added on Jan 6 2009
2 comments
7,588 views