http://blog.csdn.net/tianlesoftware/article/details/7220657
一./etc/oratab说明
直接使用cat 查看这个文件:
[plain] view plaincopy
01.gg1:/home/oracle> cat /etc/oratab
02.#
03.
04.# This file is used by ORACLEutilities. It is created by root.sh
05.# and updated by the Database ConfigurationAssistant when creating
06.# a database.
07.
08.# A colon, ':', is used as the fieldterminator. A new line terminates
09.# the entry. Lines beginning with a pound sign, '#', arecomments.
10.#
11.# Entries are of the form:
12.# $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
13.#
14.# The first and second fields are thesystem identifier and home
15.# directory of the databaserespectively. The third filed indicates
16.# to the dbstart utility that the databaseshould , "Y", or should not,
17.# "N", be brought up at systemboot time.
18.#
19.# Multiple entries with the same$ORACLE_SID are not allowed.
20.#
21.#
22.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 脚本
[plain] view plaincopy
01.gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbstart
02.#!/bin/sh
03.#
04.# $Id: dbstart.sh 22-may-2008.05:05:45arogers Exp $
05.# Copyright (c) 1991, 2008, Oracle. Allrights reserved.
06.#
07.
08.###################################
09.#
10.# usage: dbstart $ORACLE_HOME
11.#
12.# This script is used tostart ORACLE from /etc/rc(.local).
13.# It should ONLY beexecuted as part of the system boot procedure.
14.#
15.# This script will start all databaseslisted in the oratab file
16.# whose third field is a"Y". If the third field is setto "Y" and
17.# there is no ORACLE_SID for an entry (thefirst field is a *),
18.# then this script will ignore that entry.
19.<span style="color: rgb(255, 0, 0);">--这里就是我们之前说的,这个仅启动/etc/oratab 文件中标记为Y的实例。</span>
20.#
21.# This script requires that ASMORACLE_SID's start with a +, and
22.# that non-ASM instance ORACLE_SID's do notstart with a +.
23.#
24.# 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.
25.<span style="color: rgb(255, 0, 0);">--如果是ASM 实例,那么只能从rc.local中调用,否则CSS 服务可能不可用。</span>
26.#
27.# If you want dbstart to auto-start asingle-instance database that uses
28.# an ASM server that is auto-started by CRS(this is the default behavior
29.# for an ASM cluster), you must change thedatabase's ORATAB entry to use
30.# a third field of "W" and theASM's ORATAB entry to use a third field of "N".
31.# These values specify that dbstartauto-starts the database only after
32.# the ASM instance is up and running.
33.<span style="color: rgb(255, 0, 0);">--注意这里的W,其表示等待所有的ASM 实例启动完毕后在启动数据库。</span>
34.#
35.# Note:
36.# Use ORACLE_TRACE=T for tracing thisscript.
37.#
38.# The progress log for each instancebringup plus Error and Warning message[s]
39.# are logged in file $ORACLE_HOME/startup.log.The error messages related to
40.# instance bringup are also logged tosyslog (system log module).
41.# The Listener log is located at$ORACLE_HOME_LISTNER/listener.log
42.<span style="color: rgb(255, 0, 0);">--启动日志存放在$ORACLE_HOME/startup.log里。</span>
43.#
44.# On all UNIX platforms except SOLARIS
45.# ORATAB=/etc/oratab
46.#
47.# To configure, update ORATAB withInstances that need to be started up
48.# Entries are of the form:
49.# $ORACLE_SID:$ORACLE_HOME:<N|Y|W>:
50.# An example entry:
51.# main:/usr/lib/oracle/emagent_10g:Y
52.#
53.# Overall algorithm:
54.<span style="color: rgb(255, 0, 0);">--启动顺序</span>
55.# 1) Bring up all ASM instances with 'Y'entry in status field in oratab entry
56.<span style="color: rgb(255, 0, 0);">--启动状态为Y的所有ASM 实例</span>
57.# 2) Bring up all Database instances with'Y' entry in status field in
58.# oratab entry
59.<span style="color: rgb(255, 0, 0);">--启动所有状态为Y的数据库实例</span>
60.# 3) If there are Database instances with'W' entry in status field
61.# then
62.# iterate over all ASM instances (irrespective of 'Y' or 'N') AND
63.# wait for all of them to be started
64.# fi
65.<span style="color: rgb(255, 0, 0);">--如果数据库的状态为W,则等待ASM 实例启动完毕,再启动</span>
66.# 4) Bring up all Database instances with'W' entry in status field in
67.# oratab entry
68.<span style="color: rgb(255, 0, 0);">--启动所有状态为W的数据库实例</span>
69.#
70.#####################################
71.
72.LOGMSG="logger -puser.alert -s "
73.
74.trap 'exit' 1 2 3
75.
76.# for script tracing
77.case $ORACLE_TRACE in
78. T)set -x ;;
79.esac
80.
81.# Set path if path not set (if called from/etc/rc)
82.SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
83.SAVE_LLP=$LD_LIBRARY_PATH
84.
85.# First argument is used to bring up OracleNet Listener
86.ORACLE_HOME_LISTNER=$1
87.if [ ! $ORACLE_HOME_LISTNER ] ; then
88. echo "ORACLE_HOME_LISTNER is not SET, unable to auto-start OracleNet Listener"
89. echo "Usage: $0 ORACLE_HOME"
90.else
91. LOG=$ORACLE_HOME_LISTNER/listener.log
92.
93. #Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
94. # adifferent ORACLE_HOME for each entry in the oratab.
95. export ORACLE_HOME=$ORACLE_HOME_LISTNER
96.
97. #Start Oracle Net Listener
98. if[ -x $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
99. echo "$0: Starting Oracle Net Listener" >> $LOG2>&1
100. $ORACLE_HOME_LISTNER/bin/lsnrctl start >> $LOG 2>&1 &
101. VER10LIST=`$ORACLE_HOME_LISTNER/bin/lsnrctl version | grep "LSNRCTLfor " | cut -d' ' -f5 | cut -d'.' -f1`
102. export VER10LIST
103. else
104. echo "Failed to auto-start Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
105. fi
106.fi
107.
108.# Set this in accordance with the platform
109.ORATAB=/etc/oratab
110.if [ ! $ORATAB ] ; then
111. echo "$ORATAB not found"
112. exit 1;
113.fi
114.
115.# Checks Version Mismatch between Listenerand Database Instance.
116.# A version 10 listener is required for anOracle Database 10g database.
117.# Previous versions of the listener are notsupported for use with an Oracle
118.# Database 10g database. However, it ispossible to use a version 10 listener
119.# with previous versions of the Oracledatabase.
120.checkversionmismatch() {
121. if[ $VER10LIST ] ; then
122. VER10INST=`sqlplus -V | grep "Release " | cut -d' ' -f3 | cut-d'.' -f1`
123. if [ $VER10LIST -lt $VER10INST ] ; then
124. $LOGMSG "Listener version $VER10LIST NOT supported with Databaseversion $VER10INST"
125. $LOGMSG "Restart Oracle Net Listener using an alternateORACLE_HOME_LISTNER:"
126. $LOGMSG "lsnrctl start"
127. fi
128. fi
129.}
130.
131.# Starts a DatabaseInstance
132.startinst() {
133. #Called programs use same database ID
134. export ORACLE_SID
135.
136. #Put $ORACLE_HOME/bin into PATH and export.
137. PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
138. #add for bug # 652997
139. LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
140. PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
141. SPFILE=${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora
142. SPFILE1=${ORACLE_HOME}/dbs/spfile.ora
143.
144. echo ""
145. echo "$0: Starting up database \"$ORACLE_SID\""
146. date
147. echo ""
148.
149. checkversionmismatch
150.
151. #See if it is a V6 or V7 database
152. VERSION=undef
153. if[ -f $ORACLE_HOME/bin/sqldba ] ; then
154. SQLDBA=sqldba
155. VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
156. /SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
157. print V[1]}'`
158. case $VERSION in
159. "6") ;;
160. *) VERSION="internal" ;;
161. esac
162. else
163. if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
164. SQLDBA=svrmgrl
165. VERSION="internal"
166. else
167. SQLDBA="sqlplus /nolog"
168. fi
169. fi
170.
171. STATUS=1
172. if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.dbf ] ; then
173. STATUS="-1"
174. fi
175. if[ -f $ORACLE_HOME/dbs/sgadef${ORACLE_SID}.ora ] ; then
176. STATUS="-1"
177. fi
178. pmon=`ps -ef | grep -w "ora_pmon_$ORACLE_SID" | grep -v grep`
179. if[ "$pmon" != "" ] ; then
180. STATUS="-1"
181. $LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" alreadystarted."
182. fi
183.
184. if[ $STATUS -eq -1 ] ; then
185. $LOGMSG "Warning: ${INST} \"${ORACLE_SID}\" possibly leftrunning when system went down (system crash?)."
186. $LOGMSG "Action: Notify Database Administrator."
187. case $VERSION in
188. "6") sqldba"command=shutdown abort" ;;
189. "internal") $SQLDBA$args <<EOF
190.connect internal
191.shutdown abort
192.EOF
193. ;;
194. *) $SQLDBA $args <<EOF
195.connect / as sysdba
196.shutdown abort
197.quit
198.EOF
199. ;;
200. esac
201.
202. if [ $? -eq 0 ] ; then
203. STATUS=1
204. else
205. $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
206. fi
207. fi
208.
209. if[ $STATUS -eq 1 ] ; then
210. if [ -e $SPFILE -o -e $SPFILE1 -o -e $PFILE ] ; then
211. case $VERSION in
212. "6") sqldbacommand=startup ;;
213. "internal") $SQLDBA<<EOF
214.connect internal
215.startup
216.EOF
217. ;;
218. *) $SQLDBA <<EOF
219.connect / as sysdba
220.startup
221.quit
222.EOF
223. ;;
224. esac
225.
226. if [ $? -eq 0 ] ; then
227. echo ""
228. echo "$0: ${INST}\"${ORACLE_SID}\" warm started."
229. else
230. $LOGMSG ""
231. $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
232. fi
233. else
234. $LOGMSG ""
235. $LOGMSG "No init file found for ${INST}\"${ORACLE_SID}\"."
236. $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted."
237. fi
238. fi
239.}
240.
241.# Starts an ASM Instance
242.startasminst() {
243. #Called programs use same database ID
244. export ORACLE_SID
245. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
246. #Called scripts use same home directory
247. export ORACLE_HOME
248.
249. #For ASM instances, we have a dependency on the CSS service.
250. #Wait here for it to become available before instance startup.
251.
252. #Is the 10g install intact? Are all necessary binaries present?
253. if[ ! -x $ORACLE_HOME/bin/crsctl ]; then
254. $LOGMSG "$ORACLE_HOME/bin/crsctl not found when attempting tostart"
255. $LOGMSG " ASM instance$ORACLE_SID."
256.
257. else
258. COUNT=0
259. $ORACLE_HOME/bin/crsctl check css
260. RC=$?
261. while [ "$RC" != "0" ];
262. do
263. COUNT=`expr $COUNT + 1`
264. if [ $COUNT = 15 ] ; then
265. # 15 tries with 20 sec interval => 5 minutes timeout
266. $LOGMSG "Timed out waiting to start ASM instance$ORACLE_SID"
267. $LOGMSG " CSS service is NOTavailable."
268. exit $COUNT
269. fi
270. $LOGMSG "Waiting for Oracle CSS service to be available beforestarting "
271. $LOGMSG " ASM instance $ORACLE_SID. Wait $COUNT."
272. sleep 20
273. $ORACLE_HOME/bin/crsctl check css
274. RC=$?
275. done
276. fi
277. startinst
278.}
279.
280.# Start of dbstartupscript
281.#
282.# Loop for every entry in oratab file andand try to start
283.# that ORACLE.
284.#
285.# ASM instances need to be started before'Database instances'
286.# ASM instance is identified with '+'prefix in ORACLE_SID
287.# Following loop brings up ASM instance[s]
288.
289.cat $ORATAB | while read LINE
290.do
291.case $LINE in
292. \#*) ;; #comment-line in oratab
293. *)
294. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
295. if[ "$ORACLE_SID" = '*' ] ; then
296. #same as NULL SID - ignore this entry
297. ORACLE_SID=""
298. continue
299. fi
300. #Proceed only if last field is 'Y'.
301. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
302. #If ASM instances
303. if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
304. INST="ASM instance"
305. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
306. # Called scripts use same home directory
307. export ORACLE_HOME
308. # file for logging script's output
309. LOG=$ORACLE_HOME/startup.log
310. touch $LOG
311. chmod a+r $LOG
312. echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
313. startasminst >> $LOG 2>&1
314. fi
315. fi
316. ;;
317.esac
318.done
319.
320.# exit if there was any trouble bringing upASM instance[s]
321.if [ "$?" != "0" ] ;then
322. exit 2
323.fi
324.
325.#
326.# Following loop brings up 'Database instances'
327.#
328.cat $ORATAB | while read LINE
329.do
330.case $LINE in
331. \#*) ;; #comment-line in oratab
332. *)
333. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
334. if[ "$ORACLE_SID" = '*' ] ; then
335. #same as NULL SID - ignore this entry
336. ORACLE_SID=""
337. continue
338. fi
339. #Proceed only if last field is 'Y'.
340. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
341. #If non-ASM instances
342. if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
343. INST="Database instance"
344. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
345. # Called scripts use same home directory
346. export ORACLE_HOME
347. # file for logging script's output
348. LOG=$ORACLE_HOME/startup.log
349. touch $LOG
350. chmod a+r $LOG
351. echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
352. startinst >> $LOG 2>&1
353. fi
354. fi
355. ;;
356.esac
357.done
358.
359.#
360.# Following loop brings up 'Databaseinstances' that have wait state 'W'
361.#
362.cat $ORATAB | while read LINE
363.do
364.case $LINE in
365. \#*) ;; #comment-line in oratab
366. *)
367. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
368. if[ "$ORACLE_SID" = '*' ] ; then
369. #same as NULL SID - ignore this entry
370. ORACLE_SID=""
371. continue
372. fi
373. #Proceed only if last field is 'W'.
374. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
375. W_ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
376. #DB instances with 'W' (wait state) have a dependency on ASM instances via CRS.
377. #Wait here for 'all' ASM instances to become available.
378. cat $ORATAB | while read LINE
379. do
380. case $LINE in
381. \#*) ;; #comment-line in oratab
382. *)
383. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
384. if [ "$ORACLE_SID" = '*' ] ; then
385. # same as NULL SID - ignore this entry
386. ORACLE_SID=""
387. continue
388. fi
389. if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
390. INST="ASM instance"
391. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
392. if [ -x $ORACLE_HOME/bin/srvctl ] ; then
393. COUNT=0
394. NODE=`olsnodes -l`
395. RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
396. RC=$?
397. while [ "$RC" != "0" ]; # wait until this comes up!
398. do
399. COUNT=$((COUNT+1))
400. if [ $COUNT = 5 ] ; then
401. # 5 tries with 60 sec interval=> 5 minutes timeout
402. $LOGMSG "Error: Timed outwaiting on CRS to start ASM instance $ORACLE_SID"
403. exit $COUNT
404. fi
405. $LOGMSG "Waiting for Oracle CRS service to start ASM instance$ORACLE_SID"
406. $LOGMSG "Wait $COUNT."
407. sleep 60
408. RNODE=`srvctl status asm -n $NODE | grep "$ORACLE_SID isrunning"`
409. RC=$?
410. done
411. else
412. $LOGMSG "Error: \"${W_ORACLE_SID}\" has dependency on ASMinstance \"${ORACLE_SID}\""
413. $LOGMSG "Error: Need $ORACLE_HOME/bin/srvctl to check thisdependency"
414. fi
415. fi # asm instance
416. ;;
417. esac
418. done # innner while
419. fi
420. ;;
421.esac
422.done # outer while
423.
424.# by now all the ASM instances have come upand we can proceed to bring up
425.# DB instance with 'W' wait status
426.
427.cat $ORATAB | while read LINE
428.do
429.case $LINE in
430. \#*) ;; #comment-line in oratab
431. *)
432. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
433. if[ "$ORACLE_SID" = '*' ] ; then
434. #same as NULL SID - ignore this entry
435. ORACLE_SID=""
436. continue
437. fi
438. #Proceed only if last field is 'W'.
439. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
440. INST="Database instance"
441. if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
442. $LOGMSG "Error: ${INST} \"${ORACLE_SID}\" NOTstarted"
443. $LOGMSG "Error: incorrect usage: 'W' not allowed for ASMinstances"
444. continue
445. fi
446. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
447. #Called scripts use same home directory
448. export ORACLE_HOME
449. #file for logging script's output
450. LOG=$ORACLE_HOME/startup.log
451. touch $LOG
452. chmod a+r $LOG
453. echo "Processing $INST \"$ORACLE_SID\": log file$ORACLE_HOME/startup.log"
454. startinst >> $LOG 2>&1
455. fi
456. ;;
457.esac
458.done
459.gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>
2.2 dbshut 脚本
[plain] view plaincopy
01.gg1:/u01/app/oracle/product/11.2.0.3/db_1/bin>cat dbshut
02.#!/bin/sh
03.#
04.# $Id: dbshut.sh 22-may-2008.05:19:31arogers Exp $
05.# Copyright (c) 1991, 2008, Oracle. Allrights reserved.
06.#
07.
08.###################################
09.#
10.# usage: dbshut $ORACLE_HOME
11.#
12.# This script is used to shutdown ORACLEfrom /etc/rc(.local).
13.# It should ONLY be executed as part of thesystem boot procedure.
14.#
15.# This script will shutdown all databaseslisted in the oratab file
16.# whose third field is a "Y" or"W". If the third field is setto "Y" and
17.# there is no ORACLE_SID for an entry (thefirst field is a *),
18.# then this script will ignore that entry.
19.#
20.# This script requires that ASMORACLE_SID's start with a +, and
21.# that non-ASM instance ORACLE_SID's do notstart with a +.
22.#
23.# Note:
24.# Use ORACLE_TRACE=T for tracing this script.
25.# Oracle Net Listener is also shutdownusing this script.
26.#
27.# The progress log for each instanceshutdown is logged in file
28.# $ORACLE_HOME/shutdown.log.
29.#
30.# On all UNIX platforms except SOLARIS
31.# ORATAB=/etc/oratab
32.#
33.# To configure, update ORATAB withInstances that need to be shutdown
34.# Entries are of the form:
35.# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
36.# An example entry:
37.# main:/usr/lib/oracle/emagent_10g:Y
38.#
39.#####################################
40.
41.trap 'exit' 1 2 3
42.case $ORACLE_TRACE in
43. T) set-x ;;
44.esac
45.
46.# Set path if path not set (if called from/etc/rc)
47.SAVE_PATH=/bin:/usr/bin:/etc:${PATH} ;export PATH
48.SAVE_LLP=$LD_LIBRARY_PATH
49.
50.# The this to bring down Oracle Net Listener
51.ORACLE_HOME_LISTNER=$1
52.if [ ! $ORACLE_HOME_LISTNER ] ; then
53. echo"ORACLE_HOME_LISTNER is not SET, unable to auto-stop Oracle NetListener"
54. echo "Usage: $0 ORACLE_HOME"
55.else
56. LOG=$ORACLE_HOME_LISTNER/listener.log
57.
58. #Set the ORACLE_HOME for the Oracle Net Listener, it gets reset to
59. # adifferent ORACLE_HOME for each entry in the oratab.
60. export ORACLE_HOME=$ORACLE_HOME_LISTNER
61.
62. #Stop Oracle Net Listener
63. if[ -f $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
64. echo "$0: Stoping Oracle Net Listener" >> $LOG2>&1
65. $ORACLE_HOME_LISTNER/bin/lsnrctl stop >> $LOG 2>&1 &
66. else
67. echo "Failed to auto-stop Oracle Net Listener using$ORACLE_HOME_LISTNER/bin/tnslsnr"
68. fi
69.fi
70.
71.# Set this in accordance with the platform
72.ORATAB=/etc/oratab
73.if [ ! $ORATAB ] ; then
74. echo "$ORATAB not found"
75. exit 1;
76.fi
77.
78.# Stops an instance
79.stopinst() {
80. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
81. if[ "$ORACLE_SID" = '*' ] ; then
82. ORACLE_SID=""
83. fi
84.# Called programs use same database ID
85. export ORACLE_SID
86. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
87.# Called scripts use same home directory
88. export ORACLE_HOME
89.# Put $ORACLE_HOME/bin into PATH andexport.
90. PATH=$ORACLE_HOME/bin:${SAVE_PATH} ; export PATH
91.# add for bug 652997
92. LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${SAVE_LLP} ; export LD_LIBRARY_PATH
93. PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
94.
95.# See if it is a V6 or V7 database
96. VERSION=undef
97. if[ -f $ORACLE_HOME/bin/sqldba ] ; then
98. SQLDBA=sqldba
99. VERSION=`$ORACLE_HOME/bin/sqldba command=exit | awk '
100. /SQL\*DBA: (Release|Version)/ {split($3, V, ".") ;
101. print V[1]}'`
102. case $VERSION in
103. "6") ;;
104. *) VERSION="internal" ;;
105. esac
106. else
107. if [ -f $ORACLE_HOME/bin/svrmgrl ] ; then
108. SQLDBA=svrmgrl
109. VERSION="internal"
110. else
111. SQLDBA="sqlplus /nolog"
112. fi
113. fi
114.
115. case $VERSION in
116. "6") sqldbacommand=shutdown ;;
117. "internal") $SQLDBA<<EOF
118.connect internal
119.shutdown immediate
120.EOF
121. ;;
122. *) $SQLDBA <<EOF
123.connect / as sysdba
124.shutdown immediate
125.quit
126.EOF
127. ;;
128. esac
129.
130. iftest $? -eq 0 ; then
131. echo "${INST} \"${ORACLE_SID}\" shut down."
132. else
133. echo "${INST} \"${ORACLE_SID}\" not shut down."
134. fi
135.}
136.
137.#
138.# Loop for every entry in oratab file andand try to shut down
139.# that ORACLE
140.#
141.# Following loop shuts down 'DatabaseInstance[s]' with 'Y' entry
142.
143.cat $ORATAB | while read LINE
144.do
145. case $LINE in
146. \#*) ;; #comment-line in oratab
147. *)
148. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
149. if[ "$ORACLE_SID" = '*' ] ; then
150. # NULL SID - ignore
151. ORACLE_SID=""
152. continue
153. fi
154. #Proceed only if last field is 'Y' or 'W'
155. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y" ] ; then
156. if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
157. INST="Database instance"
158. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
159. LOG=$ORACLE_HOME/shutdown.log
160. echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
161. stopinst >> $LOG 2>&1
162. fi
163. fi
164. ;;
165. esac
166.done
167.
168.#
169.# Following loop shuts down 'DatabaseInstance[s]' with 'W' entry
170.#
171.cat $ORATAB | while read LINE
172.do
173. case $LINE in
174. \#*) ;; #comment-line in oratab
175. *)
176. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
177. if[ "$ORACLE_SID" = '*' ] ; then
178. # NULL SID - ignore
179. ORACLE_SID=""
180. continue
181. fi
182. #Proceed only if last field is 'Y' or 'W'
183. if[ "`echo $LINE | awk -F: '{print $NF}' -`" = "W" ] ; then
184. if [ `echo $ORACLE_SID | cut -b 1` != '+' ]; then
185. INST="Database instance"
186. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
187. LOG=$ORACLE_HOME/shutdown.log
188. echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
189. stopinst >> $LOG 2>&1
190. fi
191. fi
192. ;;
193. esac
194.done
195.
196.#
197.# Following loop shuts down 'ASMInstance[s]'
198.#
199.
200.cat $ORATAB | while read LINE
201.do
202. case$LINE in
203. \#*) ;; #comment-line in oratab
204. *)
205. ORACLE_SID=`echo $LINE | awk -F: '{print $1}' -`
206. if [ "$ORACLE_SID" = '*' ] ; then
207. # NULL SID - ignore
208. ORACLE_SID=""
209. continue
210. fi
211. #Proceed only if last field is 'Y'.
212. #Entries whose last field is not Y or N are not DB entry, ignore them.
213. if [ "`echo $LINE | awk -F: '{print $NF}' -`" = "Y"] ; then
214. if [ `echo $ORACLE_SID | cut -b 1` = '+' ]; then
215. INST="ASM instance"
216. ORACLE_HOME=`echo $LINE | awk -F: '{print $2}' -`
217. LOG=$ORACLE_HOME/shutdown.log
218. echo "Processing $INST \"$ORACLE_SID\": log file$LOG"
219. stopinst >> $LOG 2>&1
220. fi
221. fi
222. ;;
223. esac
224.done
225.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