Linux 下配置Oracle开机自动启动
一./etc/oratab说明
直接使用cat 查看这个文件:
- gg1:/home/oracle> cat /etc/oratab
- #
- # This file is used by ORACLEutilities. It is created by root.sh
- # and updated by the Database ConfigurationAssistant when creating
- # a database.
- # A colon, ':', is used as the fieldterminator. A new line terminates
- # the entry. Lines beginning with a pound sign, '#', arecomments.
- #
- # Entries are of the form:
- # $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
- #
- # The first and second fields are thesystem identifier and home
- # directory of the databaserespectively. The third filed indicates
- # to the dbstart utility that the databaseshould , "Y", or should not,
- # "N", be brought up at systemboot time.
- #
- # Multiple entries with the same$ORACLE_SID are not allowed.
- #
- #
- gg1:/u01/app/oracle/product/11.2.0.3/db_1:N
gg1:/home/oracle> cat /etc/oratab
#
# This file is used by ORACLEutilities. It is created by root.sh
# and updated by the Database ConfigurationAssistant when creating
# a database.
# A colon, ':', is used as the fieldterminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', arecomments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
#
# The first and second fields are thesystem identifier and home
# directory of the databaserespectively. The third filed indicates
# to the dbstart utility that the databaseshould , "Y", or should not,
# "N", be brought up at systemboot time.
#
# Multiple entries with the same$ORACLE_SID are not allowed.
#
#
gg1:/u01/app/oracle/product/11.2.0.3/db_1:N
这里是我测试环境上的文件,在这个注释里面,对这个文件讲的比较清楚。/etc/oratab 由root.sh 脚本创建,在用DBCA 创建实例时也会更新这个文件。
当$ORACLE_SID:$ORACLE_HOME:<N|Y> 设置为Y时,允许实例自启动,当设置为N时,则不允许自启动。 这个文件里的配置仅仅起一个开关的作用,其并不会具体的执行启动和关闭,具体的操作由$ORACLE_HOME/bin/dbstart和dbshut 脚本来实现。 这2个脚本在执行时会检查/etc/oratab 文件里的配置,为Y时才能继续执行。
所以配置数据库自启动和关闭的步骤如下:
(1) 配置/etc/oratab
(2) 修改$ORACLE_HOME/bin/dbstart和dbshut,并将其添加到/etc/rc(.local) 文件中。
这里是使用oracle 自带的dbstart 和dbshut脚本,如果使用自己写的脚本来启动或关闭DB 就不需要关心这个文件的设置了。
二.$ORACLE_HOME/bin/dbstart,dbshut 说明
2.1 dbstart 脚本
- gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbstart
- #!/bin/sh
- #
- # $Id: dbstart.sh 22-may-2008.05:05:45arogers Exp $
- # Copyright (c) 1991, 2008, Oracle. Allrights reserved.
- #
- ###################################
- #
- # usage: dbstart $ORACLE_HOME
- #
- # This script is used tostart ORACLE from /etc/rc(.local).
- # It should ONLY beexecuted as part of the system boot procedure.
- #
- # This script will start all databaseslisted in the oratab file
- # whose third field is a"Y". If the third field is setto "Y" and
- # there is no ORACLE_SID for an entry (thefirst field is a *),
- # then this script will ignore that entry.
- <SPAN style="COLOR: rgb(255,0,0)">--这里就是我们之前说的,这个仅启动/etc/oratab 文件中标记为Y的实例。</SPAN>
- #
- # This script requires that ASMORACLE_SID's start with a +, and
- # that non-ASM instance ORACLE_SID's do notstart with a +.
- #
- # If ASM instances are to be started withthis script, it cannot be used inside an rc*.d directory, and should be invokedfrom rc.local only. Otherwise, the CSS service may not be available yet, andthis script will block init from completing the boot cycle.
- <SPAN style="COLOR: rgb(255,0,0)">--如果是ASM 实例,那么只能从rc.local中调用,否则CSS 服务可能不可用。</SPAN>
- #
- # If you want dbstart to auto-start asingle-instance database that uses
- # an ASM server that is auto-started by CRS(this is the default behavior
- # for an ASM cluster), you must change thedatabase's ORATAB entry to use
- # a third field of "W" and theASM's ORATAB entry to use a third field of "N".
- # These values specify that dbstartauto-starts the database only after
- # the ASM instance is up and running.
- <SPAN style="COLOR: rgb(255,0,0)">--注意这里的W,其表示等待所有的ASM 实例启动完毕后在启动数据库。</SPAN>
- #
- # Note:
- # Use ORACLE_TRACE=T for tracing thisscript.
- #
- # The progress log for each instancebringup plus Error and Warning message[s]
- # are logged in file $ORACLE_HOME/startup.log.The error messages related to
- # instance bringup are also logged tosyslog (system log module).
- # The Listener log is located at$ORACLE_HOME_LISTNER/listener.log
- <SPAN style="COLOR: rgb(255,0,0)">--启动日志存放在$ORACLE_HOME/startup.log里。</SPAN>
- #
- # On all UNIX platforms except SOLARIS
- # ORATAB=/etc/oratab
- #
- # To configure, update ORATAB withInstances that need to be started up
- # Entries are of the form:
- # $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
- # An example entry:
- # main:/usr/lib/oracle/emagent_10g:Y
- #
- # Overall algorithm:
- <SPAN style="COLOR: rgb(255,0,0)">--启动顺序</SPAN>
- # 1) Bring up all ASM instances with 'Y'entry in status field in oratab entry
- <SPAN style="COLOR: rgb(255,0,0)">--启动状态为Y的所有ASM 实例</SPAN>
- # 2) Bring up all Database instances with'Y' entry in status field in
- # oratab entry
- <SPAN style="COLOR: rgb(255,0,0)">--启动所有状态为Y的数据库实例</SPAN>
- # 3) If there are Database instances with'W' entry in status field
- # then
- # iterate over all ASM instances (irrespective of 'Y' or 'N') AND
- # wait for all of them to be started
- # fi
- <SPAN style="COLOR: rgb(255,0,0)">--如果数据库的状态为W,则等待ASM 实例启动完毕,再启动</SPAN>
- # 4) Bring up all Database instances with'W' entry in status field in
- # oratab entry
- <SPAN style="COLOR: rgb(255,0,0)">--启动所有状态为W的数据库实例</SPAN>
- #
- #####################################
- LOGMSG="logger -puser.alert -s "
- trap 'exit' 1 2 3
- # for script tracing
- case $ORACLE_TRACE in
- T)set -x ;;
- esac
- # Set path if path not set (if called from/etc/rc)
- SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
- SAVE_LLP=$LD_LIBRARY_PATH
- # First argument is used to bring up OracleNet Listener
- ORACLE_HOME_LISTNER=$1
- if [ ! $ORACLE_HOME_LISTNER ] ; then
- echo "ORACLE_HOME_LISTNER is not SET, unable to auto-start OracleNet Listener"
- echo "Usage: $0 ORACLE_HOME"
- else
- LOG=$ORACLE_HOME_LISTNER/listener.log
- #Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
- # adifferent ORACLE_HOME for each entry in the oratab.
- export ORACLE_HOME=$ORACLE_HOME_LISTNER
- #Start Oracle Net Listener
- if[ -x $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
- echo "$0: Starting Oracle Net Listener" >> $LOG2>&1
- $ORACLE_HOME_LISTNER/bin/lsnrctl start >> $LOG 2>&1 &
- VER10LIST=`$ORACLE_HOME_LISTNER/bin/lsnrctl version | grep "LSNRCTLfor " | cut -d' ' -f5 | cut -d'.' -f1`
- export VER10LIST
- else
- echo "Failed to auto-start Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
- fi
- fi
- # Set this in accordance with the platform
- ORATAB=/etc/oratab
- if [ ! $ORATAB ] ; then
- echo "$ORATAB not found"
- exit 1;
- fi
- # Checks Version Mismatch between Listenerand Database Instance.
- # A version 10 listener is required for anOracle Database 10g database.
- # Previous versions of the listener are notsupported for use with an Oracle
- # Database 10g database. However, it ispossible to use a version 10 listener
- # with previous versions of the Oracledatabase.
- checkversionmismatch() {
- if[ $VER10LIST ] ; then
- VER10INST=`sqlplus -V | grep "Release " | cut -d' ' -f3 | cut-d'.' -f1`
- if [ $VER10LIST -lt $VER10INST ] ; then
- $LOGMSG "Listener version $VER10LIST NOT supported with Databaseversion $VER10INST"
- $LOGMSG "Restart Oracle Net Listener using an alternateORACLE_HOME_LISTNER:"
- $LOGMSG "lsnrctl start"
- fi
- fi
- }
- # Starts a DatabaseInstance
- startinst() {
- #Called programs use same database ID
- export ORACLE_SID
- #Put $ORACLE_HOME/bin into PATH and export.
- PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
- #add for bug # 652997
- LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
- PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
- SPFILE=${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora
- SPFILE1=${ORACLE_HOME}/dbs/spfile.ora
- echo ""
- echo "$0: Starting up database \"$ORACLE_SID\""
- date
- echo ""
- checkversionmismatch
- #See if it is a V6 or V7 database
- VERSION=undef
- if[ -f $ORACLE_HOME/bin/sqldba ] ; then
- SQLDBA=sqldba
- VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
- /SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
- print V[1]}'`
- case $VERSION in
- "6") ;;
- *) VERSION="internal" ;;
- esac
- else
- if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
- SQLDBA=svrmgrl
- VERSION="internal"
- else
- SQLDBA="sqlplus /nolog"
- fi
- fi
- STATUS=1
- if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.dbf ] ; then
- STATUS="-1"
- fi
- if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.ora ] ; then
- STATUS="-1"
- fi
- pmon=`ps -ef | grep -w "ora_pmon_$ORACLE_SID" | grep -v grep`
- if[ "$pmon" != "" ] ; then
- STATUS="-1"
- $LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" alreadystarted."
- fi
- if[ $STATUS -eq -1 ] ; then
- $LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" possibly leftrunning when system went down (system crash?)."
- $LOGMSG "Action: Notify Database Administrator."
- case $VERSION in
- "6") sqldba"command=shutdown abort" ;;
- "internal") $SQLDBA$args <<EOF
- connect internal
- shutdown abort
- EOF
- ;;
- *) $SQLDBA $args <<EOF
- connect / as sysdba
- shutdown abort
- quit
- EOF
- ;;
- esac
- if [ $? -eq 0 ] ; then
- STATUS=1
- else
- $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
- fi
- fi
- if[ $STATUS -eq 1 ] ; then
- if [ -e $SPFILE -o -e $SPFILE1 -o -e $PFILE ] ; then
- case $VERSION in
- "6") sqldbacommand=startup ;;
- "internal") $SQLDBA<<EOF
- connect internal
- startup
- EOF
- ;;
- *) $SQLDBA <<EOF
- connect / as sysdba
- startup
- quit
- EOF
- ;;
- esac
- if [ $? -eq 0 ] ; then
- echo ""
- echo "$0: ${INST}\"${ORACLE_SID}\" warm started."
- else
- $LOGMSG ""
- $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
- fi
- else
- $LOGMSG ""
- $LOGMSG "No init file found for ${INST}\"${ORACLE_SID}\"."
- $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
- fi
- fi
- }
- # Starts an ASM Instance
- startasminst() {
- #Called programs use same database ID
- export ORACLE_SID
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- #Called scripts use same home directory
- export ORACLE_HOME
- #For ASM instances, we have a dependency on the CSS service.
- #Wait here for it to become available before instance startup.
- #Is the 10g install intact? Are all necessary binaries present?
- if[ ! -x $ORACLE_HOME/bin/crsctl ]; then
- $LOGMSG "$ORACLE_HOME/bin/crsctl not found when attempting tostart"
- $LOGMSG " ASM instance$ORACLE_SID."
- else
- COUNT=0
- $ORACLE_HOME/bin/crsctl check css
- RC=$?
- while [ "$RC" != "0" ];
- do
- COUNT=`expr $COUNT + 1`
- if [ $COUNT = 15 ] ; then
- # 15 tries with 20 sec interval => 5 minutes timeout
- $LOGMSG "Timed out waiting to start ASM instance$ORACLE_SID"
- $LOGMSG " CSS service is NOTavailable."
- exit $COUNT
- fi
- $LOGMSG "Waiting for Oracle CSS service to be available beforestarting "
- $LOGMSG " ASM instance $ORACLE_SID. Wait $COUNT."
- sleep 20
- $ORACLE_HOME/bin/crsctl check css
- RC=$?
- done
- fi
- startinst
- }
- # Start of dbstartupscript
- #
- # Loop for every entry in oratab file andand try to start
- # that ORACLE.
- #
- # ASM instances need to be started before'Database instances'
- # ASM instance is identified with '+'prefix in ORACLE_SID
- # Following loop brings up ASM instance[s]
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- #same as NULL SID - ignore this entry
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'Y'.
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
- #If ASM instances
- if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
- INST="ASM instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- # Called scripts use same home directory
- export ORACLE_HOME
- # file for logging script's output
- LOG=$ORACLE_HOME/startup.log
- touch $LOG
- chmod a+r $LOG
- echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
- startasminst >> $LOG 2>&1
- fi
- fi
- ;;
- esac
- done
- # exit if there was any trouble bringing upASM instance[s]
- if [ "$?" != "0" ] ;then
- exit 2
- fi
- #
- # Following loop brings up 'Database instances'
- #
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- #same as NULL SID - ignore this entry
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'Y'.
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
- #If non-ASM instances
- if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
- INST="Database instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- # Called scripts use same home directory
- export ORACLE_HOME
- # file for logging script's output
- LOG=$ORACLE_HOME/startup.log
- touch $LOG
- chmod a+r $LOG
- echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
- startinst >> $LOG 2>&1
- fi
- fi
- ;;
- esac
- done
- #
- # Following loop brings up 'Databaseinstances' that have wait state 'W'
- #
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- #same as NULL SID - ignore this entry
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'W'.
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
- W_ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- #DB instances with 'W' (wait state) have a dependency on ASM instances via CRS.
- #Wait here for 'all' ASM instances to become available.
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if [ "$ORACLE_SID" = '*' ] ; then
- # same as NULL SID - ignore this entry
- ORACLE_SID=""
- continue
- fi
- if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
- INST="ASM instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- if [ -x $ORACLE_HOME/bin/srvctl ] ; then
- COUNT=0
- NODE=`olsnodes -l`
- RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
- RC=$?
- while [ "$RC" != "0" ]; # wait until this comes up!
- do
- COUNT=$((COUNT+1))
- if [ $COUNT = 5 ] ; then
- # 5 tries with 60 sec interval=> 5 minutes timeout
- $LOGMSG "Error: Timed outwaiting on CRS to start ASM instance $ORACLE_SID"
- exit $COUNT
- fi
- $LOGMSG "Waiting for Oracle CRS service to start ASM instance$ORACLE_SID"
- $LOGMSG "Wait $COUNT."
- sleep 60
- RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
- RC=$?
- done
- else
- $LOGMSG "Error: \"${W_ORACLE_SID}\" has dependency on ASMinstance \"${ORACLE_SID}\""
- $LOGMSG "Error: Need $ORACLE_HOME/bin/srvctl to check thisdependency"
- fi
- fi # asm instance
- ;;
- esac
- done # innner while
- fi
- ;;
- esac
- done # outer while
- # by now all the ASM instances have come upand we can proceed to bring up
- # DB instance with 'W' wait status
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- #same as NULL SID - ignore this entry
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'W'.
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
- INST="Database instance"
- if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
- $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted"
- $LOGMSG "Error: incorrect usage: 'W' not allowed for ASMinstances"
- continue
- fi
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- #Called scripts use same home directory
- export ORACLE_HOME
- #file for logging script's output
- LOG=$ORACLE_HOME/startup.log
- touch $LOG
- chmod a+r $LOG
- echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
- startinst >> $LOG 2>&1
- fi
- ;;
- esac
- done
- gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbstart
#!/bin/sh
#
# $Id: dbstart.sh 22-may-2008.05:05:45arogers Exp $
# Copyright (c) 1991, 2008, Oracle. Allrights reserved.
#
###################################
#
# usage: dbstart $ORACLE_HOME
#
# This script is used tostart ORACLE from /etc/rc(.local).
# It should ONLY beexecuted as part of the system boot procedure.
#
# This script will start all databaseslisted in the oratab file
# whose third field is a"Y". If the third field is setto "Y" and
# there is no ORACLE_SID for an entry (thefirst field is a *),
# then this script will ignore that entry.
<span style="COLOR: rgb(255,0,0)">--这里就是我们之前说的,这个仅启动/etc/oratab 文件中标记为Y的实例。</span>
#
# This script requires that ASMORACLE_SID's start with a +, and
# that non-ASM instance ORACLE_SID's do notstart with a +.
#
# If ASM instances are to be started withthis script, it cannot be used inside an rc*.d directory, and should be invokedfrom rc.local only. Otherwise, the CSS service may not be available yet, andthis script will block init from completing the boot cycle.
<span style="COLOR: rgb(255,0,0)">--如果是ASM 实例,那么只能从rc.local中调用,否则CSS 服务可能不可用。</span>
#
# If you want dbstart to auto-start asingle-instance database that uses
# an ASM server that is auto-started by CRS(this is the default behavior
# for an ASM cluster), you must change thedatabase's ORATAB entry to use
# a third field of "W" and theASM's ORATAB entry to use a third field of "N".
# These values specify that dbstartauto-starts the database only after
# the ASM instance is up and running.
<span style="COLOR: rgb(255,0,0)">--注意这里的W,其表示等待所有的ASM 实例启动完毕后在启动数据库。</span>
#
# Note:
# Use ORACLE_TRACE=T for tracing thisscript.
#
# The progress log for each instancebringup plus Error and Warning message[s]
# are logged in file $ORACLE_HOME/startup.log.The error messages related to
# instance bringup are also logged tosyslog (system log module).
# The Listener log is located at$ORACLE_HOME_LISTNER/listener.log
<span style="COLOR: rgb(255,0,0)">--启动日志存放在$ORACLE_HOME/startup.log里。</span>
#
# On all UNIX platforms except SOLARIS
# ORATAB=/etc/oratab
#
# To configure, update ORATAB withInstances that need to be started up
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
# An example entry:
# main:/usr/lib/oracle/emagent_10g:Y
#
# Overall algorithm:
<span style="COLOR: rgb(255,0,0)">--启动顺序</span>
# 1) Bring up all ASM instances with 'Y'entry in status field in oratab entry
<span style="COLOR: rgb(255,0,0)">--启动状态为Y的所有ASM 实例</span>
# 2) Bring up all Database instances with'Y' entry in status field in
# oratab entry
<span style="COLOR: rgb(255,0,0)">--启动所有状态为Y的数据库实例</span>
# 3) If there are Database instances with'W' entry in status field
# then
# iterate over all ASM instances (irrespective of 'Y' or 'N') AND
# wait for all of them to be started
# fi
<span style="COLOR: rgb(255,0,0)">--如果数据库的状态为W,则等待ASM 实例启动完毕,再启动</span>
# 4) Bring up all Database instances with'W' entry in status field in
# oratab entry
<span style="COLOR: rgb(255,0,0)">--启动所有状态为W的数据库实例</span>
#
#####################################
LOGMSG="logger -puser.alert -s "
trap 'exit' 1 2 3
# for script tracing
case $ORACLE_TRACE in
T)set -x ;;
esac
# Set path if path not set (if called from/etc/rc)
SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
SAVE_LLP=$LD_LIBRARY_PATH
# First argument is used to bring up OracleNet Listener
ORACLE_HOME_LISTNER=$1
if [ ! $ORACLE_HOME_LISTNER ] ; then
echo "ORACLE_HOME_LISTNER is not SET, unable to auto-start OracleNet Listener"
echo "Usage: $0 ORACLE_HOME"
else
LOG=$ORACLE_HOME_LISTNER/listener.log
#Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
# adifferent ORACLE_HOME for each entry in the oratab.
export ORACLE_HOME=$ORACLE_HOME_LISTNER
#Start Oracle Net Listener
if[ -x $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
echo "$0: Starting Oracle Net Listener" >> $LOG2>&1
$ORACLE_HOME_LISTNER/bin/lsnrctl start >> $LOG 2>&1 &
VER10LIST=`$ORACLE_HOME_LISTNER/bin/lsnrctl version | grep "LSNRCTLfor " | cut -d' ' -f5 | cut -d'.' -f1`
export VER10LIST
else
echo "Failed to auto-start Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
fi
fi
# Set this in accordance with the platform
ORATAB=/etc/oratab
if [ ! $ORATAB ] ; then
echo "$ORATAB not found"
exit 1;
fi
# Checks Version Mismatch between Listenerand Database Instance.
# A version 10 listener is required for anOracle Database 10g database.
# Previous versions of the listener are notsupported for use with an Oracle
# Database 10g database. However, it ispossible to use a version 10 listener
# with previous versions of the Oracledatabase.
checkversionmismatch() {
if[ $VER10LIST ] ; then
VER10INST=`sqlplus -V | grep "Release " | cut -d' ' -f3 | cut-d'.' -f1`
if [ $VER10LIST -lt $VER10INST ] ; then
$LOGMSG "Listener version $VER10LIST NOT supported with Databaseversion $VER10INST"
$LOGMSG "Restart Oracle Net Listener using an alternateORACLE_HOME_LISTNER:"
$LOGMSG "lsnrctl start"
fi
fi
}
# Starts a DatabaseInstance
startinst() {
#Called programs use same database ID
export ORACLE_SID
#Put $ORACLE_HOME/bin into PATH and export.
PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
#add for bug # 652997
LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
SPFILE=${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora
SPFILE1=${ORACLE_HOME}/dbs/spfile.ora
echo ""
echo "$0: Starting up database \"$ORACLE_SID\""
date
echo ""
checkversionmismatch
#See if it is a V6 or V7 database
VERSION=undef
if[ -f $ORACLE_HOME/bin/sqldba ] ; then
SQLDBA=sqldba
VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
/SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
print V[1]}'`
case $VERSION in
"6") ;;
*) VERSION="internal" ;;
esac
else
if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
SQLDBA=svrmgrl
VERSION="internal"
else
SQLDBA="sqlplus /nolog"
fi
fi
STATUS=1
if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.dbf ] ; then
STATUS="-1"
fi
if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.ora ] ; then
STATUS="-1"
fi
pmon=`ps -ef | grep -w "ora_pmon_$ORACLE_SID" | grep -v grep`
if[ "$pmon" != "" ] ; then
STATUS="-1"
$LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" alreadystarted."
fi
if[ $STATUS -eq -1 ] ; then
$LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" possibly leftrunning when system went down (system crash?)."
$LOGMSG "Action: Notify Database Administrator."
case $VERSION in
"6") sqldba"command=shutdown abort" ;;
"internal") $SQLDBA$args <<EOF
connect internal
shutdown abort
EOF
;;
*) $SQLDBA $args <<EOF
connect / as sysdba
shutdown abort
quit
EOF
;;
esac
if [ $? -eq 0 ] ; then
STATUS=1
else
$LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
fi
fi
if[ $STATUS -eq 1 ] ; then
if [ -e $SPFILE -o -e $SPFILE1 -o -e $PFILE ] ; then
case $VERSION in
"6") sqldbacommand=startup ;;
"internal") $SQLDBA<<EOF
connect internal
startup
EOF
;;
*) $SQLDBA <<EOF
connect / as sysdba
startup
quit
EOF
;;
esac
if [ $? -eq 0 ] ; then
echo ""
echo "$0: ${INST}\"${ORACLE_SID}\" warm started."
else
$LOGMSG ""
$LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
fi
else
$LOGMSG ""
$LOGMSG "No init file found for ${INST}\"${ORACLE_SID}\"."
$LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
fi
fi
}
# Starts an ASM Instance
startasminst() {
#Called programs use same database ID
export ORACLE_SID
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
#Called scripts use same home directory
export ORACLE_HOME
#For ASM instances, we have a dependency on the CSS service.
#Wait here for it to become available before instance startup.
#Is the 10g install intact? Are all necessary binaries present?
if[ ! -x $ORACLE_HOME/bin/crsctl ]; then
$LOGMSG "$ORACLE_HOME/bin/crsctl not found when attempting tostart"
$LOGMSG " ASM instance$ORACLE_SID."
else
COUNT=0
$ORACLE_HOME/bin/crsctl check css
RC=$?
while [ "$RC" != "0" ];
do
COUNT=`expr $COUNT + 1`
if [ $COUNT = 15 ] ; then
# 15 tries with 20 sec interval => 5 minutes timeout
$LOGMSG "Timed out waiting to start ASM instance$ORACLE_SID"
$LOGMSG " CSS service is NOTavailable."
exit $COUNT
fi
$LOGMSG "Waiting for Oracle CSS service to be available beforestarting "
$LOGMSG " ASM instance $ORACLE_SID. Wait $COUNT."
sleep 20
$ORACLE_HOME/bin/crsctl check css
RC=$?
done
fi
startinst
}
# Start of dbstartupscript
#
# Loop for every entry in oratab file andand try to start
# that ORACLE.
#
# ASM instances need to be started before'Database instances'
# ASM instance is identified with '+'prefix in ORACLE_SID
# Following loop brings up ASM instance[s]
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
#same as NULL SID - ignore this entry
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'Y'.
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
#If ASM instances
if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
INST="ASM instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
# Called scripts use same home directory
export ORACLE_HOME
# file for logging script's output
LOG=$ORACLE_HOME/startup.log
touch $LOG
chmod a+r $LOG
echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
startasminst >> $LOG 2>&1
fi
fi
;;
esac
done
# exit if there was any trouble bringing upASM instance[s]
if [ "$?" != "0" ] ;then
exit 2
fi
#
# Following loop brings up 'Database instances'
#
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
#same as NULL SID - ignore this entry
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'Y'.
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
#If non-ASM instances
if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
INST="Database instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
# Called scripts use same home directory
export ORACLE_HOME
# file for logging script's output
LOG=$ORACLE_HOME/startup.log
touch $LOG
chmod a+r $LOG
echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
startinst >> $LOG 2>&1
fi
fi
;;
esac
done
#
# Following loop brings up 'Databaseinstances' that have wait state 'W'
#
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
#same as NULL SID - ignore this entry
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'W'.
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
W_ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
#DB instances with 'W' (wait state) have a dependency on ASM instances via CRS.
#Wait here for 'all' ASM instances to become available.
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if [ "$ORACLE_SID" = '*' ] ; then
# same as NULL SID - ignore this entry
ORACLE_SID=""
continue
fi
if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
INST="ASM instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
if [ -x $ORACLE_HOME/bin/srvctl ] ; then
COUNT=0
NODE=`olsnodes -l`
RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
RC=$?
while [ "$RC" != "0" ]; # wait until this comes up!
do
COUNT=$((COUNT+1))
if [ $COUNT = 5 ] ; then
# 5 tries with 60 sec interval=> 5 minutes timeout
$LOGMSG "Error: Timed outwaiting on CRS to start ASM instance $ORACLE_SID"
exit $COUNT
fi
$LOGMSG "Waiting for Oracle CRS service to start ASM instance$ORACLE_SID"
$LOGMSG "Wait $COUNT."
sleep 60
RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
RC=$?
done
else
$LOGMSG "Error: \"${W_ORACLE_SID}\" has dependency on ASMinstance \"${ORACLE_SID}\""
$LOGMSG "Error: Need $ORACLE_HOME/bin/srvctl to check thisdependency"
fi
fi # asm instance
;;
esac
done # innner while
fi
;;
esac
done # outer while
# by now all the ASM instances have come upand we can proceed to bring up
# DB instance with 'W' wait status
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
#same as NULL SID - ignore this entry
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'W'.
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
INST="Database instance"
if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
$LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted"
$LOGMSG "Error: incorrect usage: 'W' not allowed for ASMinstances"
continue
fi
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
#Called scripts use same home directory
export ORACLE_HOME
#file for logging script's output
LOG=$ORACLE_HOME/startup.log
touch $LOG
chmod a+r $LOG
echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
startinst >> $LOG 2>&1
fi
;;
esac
done
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>
2.2 dbshut 脚本
- gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbshut
- #!/bin/sh
- #
- # $Id: dbshut.sh 22-may-2008.05:19:31arogers Exp $
- # Copyright (c) 1991, 2008, Oracle. Allrights reserved.
- #
- ###################################
- #
- # usage: dbshut $ORACLE_HOME
- #
- # This script is used to shutdown ORACLEfrom /etc/rc(.local).
- # It should ONLY be executed as part of thesystem boot procedure.
- #
- # This script will shutdown all databaseslisted in the oratab file
- # whose third field is a "Y" or"W". If the third field is setto "Y" and
- # there is no ORACLE_SID for an entry (thefirst field is a *),
- # then this script will ignore that entry.
- #
- # This script requires that ASMORACLE_SID's start with a +, and
- # that non-ASM instance ORACLE_SID's do notstart with a +.
- #
- # Note:
- # Use ORACLE_TRACE=T for tracing this script.
- # Oracle Net Listener is also shutdownusing this script.
- #
- # The progress log for each instanceshutdown is logged in file
- # $ORACLE_HOME/shutdown.log.
- #
- # On all UNIX platforms except SOLARIS
- # ORATAB=/etc/oratab
- #
- # To configure, update ORATAB withInstances that need to be shutdown
- # Entries are of the form:
- # $ORACLE_SID:$ORACLE_HOME:<N|Y>:
- # An example entry:
- # main:/usr/lib/oracle/emagent_10g:Y
- #
- #####################################
- trap 'exit' 1 2 3
- case $ORACLE_TRACE in
- T) set-x ;;
- esac
- # Set path if path not set (if called from/etc/rc)
- SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
- SAVE_LLP=$LD_LIBRARY_PATH
- # The this to bring down Oracle Net Listener
- ORACLE_HOME_LISTNER=$1
- if [ ! $ORACLE_HOME_LISTNER ] ; then
- echo"ORACLE_HOME_LISTNER is not SET, unable to auto-stop Oracle NetListener"
- echo "Usage: $0 ORACLE_HOME"
- else
- LOG=$ORACLE_HOME_LISTNER/listener.log
- #Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
- # adifferent ORACLE_HOME for each entry in the oratab.
- export ORACLE_HOME=$ORACLE_HOME_LISTNER
- #Stop Oracle Net Listener
- if[ -f $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
- echo "$0: Stoping Oracle Net Listener" >> $LOG2>&1
- $ORACLE_HOME_LISTNER/bin/lsnrctl stop >> $LOG 2>&1 &
- else
- echo "Failed to auto-stop Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
- fi
- fi
- # Set this in accordance with the platform
- ORATAB=/etc/oratab
- if [ ! $ORATAB ] ; then
- echo "$ORATAB not found"
- exit 1;
- fi
- # Stops an instance
- stopinst() {
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- ORACLE_SID=""
- fi
- # Called programs use same database ID
- export ORACLE_SID
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- # Called scripts use same home directory
- export ORACLE_HOME
- # Put $ORACLE_HOME/bin into PATH andexport.
- PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
- # add for bug 652997
- LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
- PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
- # See if it is a V6 or V7 database
- VERSION=undef
- if[ -f $ORACLE_HOME/bin/sqldba ] ; then
- SQLDBA=sqldba
- VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
- /SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
- print V[1]}'`
- case $VERSION in
- "6") ;;
- *) VERSION="internal" ;;
- esac
- else
- if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
- SQLDBA=svrmgrl
- VERSION="internal"
- else
- SQLDBA="sqlplus /nolog"
- fi
- fi
- case $VERSION in
- "6") sqldbacommand=shutdown ;;
- "internal") $SQLDBA<<EOF
- connect internal
- shutdown immediate
- EOF
- ;;
- *) $SQLDBA <<EOF
- connect / as sysdba
- shutdown immediate
- quit
- EOF
- ;;
- esac
- iftest $? -eq 0 ; then
- echo "${INST} \"${ORACLE_SID}\" shut down."
- else
- echo "${INST} \"${ORACLE_SID}\" not shut down."
- fi
- }
- #
- # Loop for every entry in oratab file andand try to shut down
- # that ORACLE
- #
- # Following loop shuts down 'DatabaseInstance[s]' with 'Y' entry
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- # NULL SID - ignore
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'Y' or 'W'
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
- if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
- INST="Database instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- LOG=$ORACLE_HOME/shutdown.log
- echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
- stopinst >> $LOG 2>&1
- fi
- fi
- ;;
- esac
- done
- #
- # Following loop shuts down 'DatabaseInstance[s]' with 'W' entry
- #
- cat $ORATAB | while read LINE
- do
- case $LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if[ "$ORACLE_SID" = '*' ] ; then
- # NULL SID - ignore
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'Y' or 'W'
- if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
- if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
- INST="Database instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- LOG=$ORACLE_HOME/shutdown.log
- echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
- stopinst >> $LOG 2>&1
- fi
- fi
- ;;
- esac
- done
- #
- # Following loop shuts down 'ASMInstance[s]'
- #
- cat $ORATAB | while read LINE
- do
- case$LINE in
- \#*) ;; #comment-line in oratab
- *)
- ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
- if [ "$ORACLE_SID" = '*' ] ; then
- # NULL SID - ignore
- ORACLE_SID=""
- continue
- fi
- #Proceed only if last field is 'Y'.
- #Entries whose last field is not Y or N are not DB entry, ignore them.
- if [ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y"] ; then
- if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
- INST="ASM instance"
- ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
- LOG=$ORACLE_HOME/shutdown.log
- echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
- stopinst >> $LOG 2>&1
- fi
- fi
- ;;
- esac
- done
- gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbshut
#!/bin/sh
#
# $Id: dbshut.sh 22-may-2008.05:19:31arogers Exp $
# Copyright (c) 1991, 2008, Oracle. Allrights reserved.
#
###################################
#
# usage: dbshut $ORACLE_HOME
#
# This script is used to shutdown ORACLEfrom /etc/rc(.local).
# It should ONLY be executed as part of thesystem boot procedure.
#
# This script will shutdown all databaseslisted in the oratab file
# whose third field is a "Y" or"W". If the third field is setto "Y" and
# there is no ORACLE_SID for an entry (thefirst field is a *),
# then this script will ignore that entry.
#
# This script requires that ASMORACLE_SID's start with a +, and
# that non-ASM instance ORACLE_SID's do notstart with a +.
#
# Note:
# Use ORACLE_TRACE=T for tracing this script.
# Oracle Net Listener is also shutdownusing this script.
#
# The progress log for each instanceshutdown is logged in file
# $ORACLE_HOME/shutdown.log.
#
# On all UNIX platforms except SOLARIS
# ORATAB=/etc/oratab
#
# To configure, update ORATAB withInstances that need to be shutdown
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
# An example entry:
# main:/usr/lib/oracle/emagent_10g:Y
#
#####################################
trap 'exit' 1 2 3
case $ORACLE_TRACE in
T) set-x ;;
esac
# Set path if path not set (if called from/etc/rc)
SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
SAVE_LLP=$LD_LIBRARY_PATH
# The this to bring down Oracle Net Listener
ORACLE_HOME_LISTNER=$1
if [ ! $ORACLE_HOME_LISTNER ] ; then
echo"ORACLE_HOME_LISTNER is not SET, unable to auto-stop Oracle NetListener"
echo "Usage: $0 ORACLE_HOME"
else
LOG=$ORACLE_HOME_LISTNER/listener.log
#Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
# adifferent ORACLE_HOME for each entry in the oratab.
export ORACLE_HOME=$ORACLE_HOME_LISTNER
#Stop Oracle Net Listener
if[ -f $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
echo "$0: Stoping Oracle Net Listener" >> $LOG2>&1
$ORACLE_HOME_LISTNER/bin/lsnrctl stop >> $LOG 2>&1 &
else
echo "Failed to auto-stop Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
fi
fi
# Set this in accordance with the platform
ORATAB=/etc/oratab
if [ ! $ORATAB ] ; then
echo "$ORATAB not found"
exit 1;
fi
# Stops an instance
stopinst() {
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
ORACLE_SID=""
fi
# Called programs use same database ID
export ORACLE_SID
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
# Called scripts use same home directory
export ORACLE_HOME
# Put $ORACLE_HOME/bin into PATH andexport.
PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
# add for bug 652997
LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
# See if it is a V6 or V7 database
VERSION=undef
if[ -f $ORACLE_HOME/bin/sqldba ] ; then
SQLDBA=sqldba
VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
/SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
print V[1]}'`
case $VERSION in
"6") ;;
*) VERSION="internal" ;;
esac
else
if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
SQLDBA=svrmgrl
VERSION="internal"
else
SQLDBA="sqlplus /nolog"
fi
fi
case $VERSION in
"6") sqldbacommand=shutdown ;;
"internal") $SQLDBA<<EOF
connect internal
shutdown immediate
EOF
;;
*) $SQLDBA <<EOF
connect / as sysdba
shutdown immediate
quit
EOF
;;
esac
iftest $? -eq 0 ; then
echo "${INST} \"${ORACLE_SID}\" shut down."
else
echo "${INST} \"${ORACLE_SID}\" not shut down."
fi
}
#
# Loop for every entry in oratab file andand try to shut down
# that ORACLE
#
# Following loop shuts down 'DatabaseInstance[s]' with 'Y' entry
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
# NULL SID - ignore
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'Y' or 'W'
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
INST="Database instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
LOG=$ORACLE_HOME/shutdown.log
echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
stopinst >> $LOG 2>&1
fi
fi
;;
esac
done
#
# Following loop shuts down 'DatabaseInstance[s]' with 'W' entry
#
cat $ORATAB | while read LINE
do
case $LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if[ "$ORACLE_SID" = '*' ] ; then
# NULL SID - ignore
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'Y' or 'W'
if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
INST="Database instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
LOG=$ORACLE_HOME/shutdown.log
echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
stopinst >> $LOG 2>&1
fi
fi
;;
esac
done
#
# Following loop shuts down 'ASMInstance[s]'
#
cat $ORATAB | while read LINE
do
case$LINE in
\#*) ;; #comment-line in oratab
*)
ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
if [ "$ORACLE_SID" = '*' ] ; then
# NULL SID - ignore
ORACLE_SID=""
continue
fi
#Proceed only if last field is 'Y'.
#Entries whose last field is not Y or N are not DB entry, ignore them.
if [ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y"] ; then
if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
INST="ASM instance"
ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
LOG=$ORACLE_HOME/shutdown.log
echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
stopinst >> $LOG 2>&1
fi
fi
;;
esac
done
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>
通过以上信息,我们可以看出,我们只需要修改/etc/oratab脚本就可以了,dbstart 和dbshut命令可以从/etc/oratab里获取需要的参数值。
三.DB 开机自启动示例
3.1 修改/etc/oratab的值为Y
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>ll /etc/oratab
-rw-rw-r-- 1 oracle oinstall 722 Jan 3020:36 /etc/oratab
gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat /etc/oratab
#
gg1:/u01/app/oracle/product/11.2.0.3/db_1:Y
3.2 修改dbstart的ORACLE_HOME_LISTNER,使其指向$ORACLE_HOME:
# First argument is used to bring up OracleNet Listener
ORACLE_HOME_LISTNER=$ORACLE_HOME
3.3 用root用户在rc.local里添加如下内容:
[root@gg1 ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* allthe other init scripts.
# You can put your own initialization stuffin here if you don't
# want to do the full Sys V style initstuff.
touch /var/lock/subsys/local
su - oracle -c"/u01/app/oracle/product/11.2.0.3/db_1/bin/dbstart"
su - oracle -c"/u01/app/oracle/product/11.2.0.3/db_1/bin/emctl start dbconsole"
这里注意必须用oracle 用户来启动脚本。
3.4 reboot 系统,Oracle就自动启动了。
在我们的配置中,启动的包括监听,实例和OEM。
启动日志如下:
gg1:/u01/app/oracle/product/11.2.0.3/db_1>cat startup.log
/u01/app/oracle/product/11.2.0.3/db_1/bin/dbstart:Starting up database "gg1"
Mon Jan 30 20:48:26 CST 2012
SQL*Plus: Release 11.2.0.3.0 Production onMon Jan 30 20:48:31 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> Connected to an idle instance.
SQL> ORACLE instance started.
Total System Global Area 939495424 bytes
Fixed Size 2233960 bytes
Variable Size 675285400 bytes
Database Buffers 255852544 bytes
Redo Buffers 6123520 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining andReal Application Testing options
/u01/app/oracle/product/11.2.0.3/db_1/bin/dbstart:Database instance "gg1" warm started.
gg1:/u01/app/oracle/product/11.2.0.3/db_1>cat listener.log
/u01/app/oracle/product/11.2.0.3/db_1/bin/dbstart:Starting Oracle Net Listener
LSNRCTL for Linux: Version 11.2.0.3.0 -Production on 30-JAN-2012 21:24:37
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Starting /u01/app/oracle/product/11.2.0.3/db_1/bin/tnslsnr:please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 -Production
System parameter file is/u01/app/oracle/product/11.2.0.3/db_1/network/admin/listener.ora
Log messages written to/u01/app/oracle/diag/tnslsnr/gg1/listener/alert/log.xml
Listening on:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gg1)(PORT=1521)))
Listening on:(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gg1)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version11.2.0.3.0 - Production
Start Date 30-JAN-2012 21:24:40
Uptime 0 days 0 hr. 0 min. 1 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0.3/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/gg1/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gg1)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully