安装完毕 Oracle 11g 每次都得手动启动 | 停止数据库(dbstart | dbshut)、监听器(lsnrctl)、控制台(emtcl),以下步骤实现数据库的自动启动:
1.首先修改/etc/oratab文件#vi
/etc/oratab
找到orcl=/u01/app/oracle/product/11.1.0/db_1:N这一行
改为:
orcl=/u01/app/oracle/product/11.1.0/db_1:Y
也就是将最后的N改为Y,意思是将不允许自动启动改为允许自动启动。
2.修改ORACLE自带的启动与关闭脚本,
分别是dbstart和
dbshut。执行这两个脚本就可以实现ORACLE脚本的启动与关闭。在oracle账户下修改$ORACLE_HOME/bin/dbstart文件
#su
-oracle
$cd $ORACLE_HOME/bin
$vi
dbstart
找到ORACLE_HOME_LISTNER=$1这一行
改为:ORACLE_HOME_LISTNER=$ORACLE_HOME
之所以做这一步,是因为在这个脚本自动生成的时候,也就是ORACLE被安装进RHEL的时候,这个脚本并不知道你的ORACLE_HOME_LISTNER是什么,现在要将这个参数显示的写明,这样就不会在执行这个脚本的时候报ORACLE_HOME_LISTNER没有被指定的错误了。注意:dbstart和dbshut脚本在10g之后就已经将监听器的启动与关闭合并进数据库实例的启动与关闭脚本里面了。而不再是单独分开的了。
同样的方式,我们也要修改dbshut的这个参数。这里就不再详细写出了,他们在同一个目录下。
3.写一个脚本,把它注册为一个系统服务,让它在开机与关机的时候运行。它的作用就是调用并执行dbstart和dbshut。这样不就实现了数据库启动与关闭了吗?!这个脚本被放在/etc/init.d目录中,脚本的名字是oracle11
脚本如下:
# !/bin/sh
# chkconfig: 345 61 61
# description: Oracle 11g AutoRun Services
# /etc/init.d/oracle
#
# Run-level Startup script. for the Oracle Instance, Listener, and
# Web Interface
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=ORCL
export PATH=$PATH:$ORACLE_HOME/bin
ORA_OWNR="oracle"
# if the executables do not exist -- display error
if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi
# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display
case "$1" in
start)
# Oracle listener and instance startup
su $ORA_OWNR -lc $ORACLE_HOME/bin/dbstart
touch /var/lock/subsys/oracle11
su $ORA_OWNR -lc "$ORACLE_HOME/bin/emctl start dbconsole"
echo "Oracle Start Succesful!OK."
;;
stop)
# Oracle listener and instance shutdown
su $ORA_OWNR -lc "$ORACLE_HOME/bin/emctl stop dbconsole"
su $ORA_OWNR -lc $ORACLE_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle11
echo "Oracle Stop Succesful!OK."
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo $"Usage: `basename $0` {start|stop|reload|reload}"
exit 1
esac
exit 0
保存并退出。
这段脚本的关键解释:
第一:#chkconfig:345 99
10虽是一行注释,但是确实关键的必不可少的一行,除非你不用chkconfig命令来自动生成符号连接文件,而是完全采用手工创建。否则没有这一行,执行chkconfig系统将会报出oracle11没有chkconfig服务权限的错误。
第二:su
oracle -c $ORACLE_HOME/bin/dbstart和touch
/var/lock/subsys/oracle11这两行的作用是首先执行dbstart脚本启动oracle,然后在服务活动列表目录中创建一个与oracle11这个服务同名的一个文件,表示这个服务是活动的,也就是被启动的。而su
oracle -c $ORACLE_HOME/bin/dbshut和rm -f
/var/lock/subsys/oracle11这两行的作用是首先执行dbshut急哦脚本关闭oracle,然后从服务活动列表目录中删除那个与oracle11同名的那个文件,表示这个服务不是活动的,也就是已经被关闭。
那么为什么要做touch
/var/lock/subsys/oracle11和rm -f
/var/lock/subsys/oracle11这两步呢?原因是跟LINUX系统的机制有关的:LINUX的判别一个服务是否被启动的依据是在/var/lock/subsys/目录下是否与服同名的文件,若有则表示这个服务已经被启动了,在系统关闭的时候,LINUX会把这里面列出的服务全部关闭,并删掉与服务同名的文件。若一个服务被启动了,但却在这个目录里没有那个服务的同名文件,则不会关闭那个服务。网上的文章均将这个地方设置错了,所以会发现,ORACLE可以随系统启动了,但却没有随系统关闭。我也是分析了/etc/rc.d/rc.local后才发现这个原理的。经过试验,果然如此。再分析mysql的启动与关闭脚本也是这样做的,最终恍然大悟
原来如此。这个地方请大家注意了。
4.将这个脚本注册成为一个系统服务
方法有二:
其一:先给脚本分配可以被执行的权限。执行下面命令:
#su-root
chown
oracle /etc/init.d/oracle11
chmod 775
/etc/init.d/oracle11
-------[root@oracle init.d]# chmod 750 /etc/init.d/oracle
-------链接:
-------[root@oracle init.d]# ln -s /etc/init.d/oracle /etc/rc1.d/K61oracle
-------[root@oracle init.d]# ln -s /etc/init.d/oracle /etc/rc3.d/S61oracle
-------执行以下命令:
-----[root@oracle init.d]# chkconfig --level 345 oracle on (参数--level 为两个"-" ,下同)
-----[root@oracle init.d]# chkconfig --add oracle // 添加到服务里
再创建符号链接文件。
chkconfig --add
/etc/init.d/oracle11,执行这个命令就需要你在脚本中写上#chkconfig:3459910了。这样当这个命令被执行的时候,回去oracle11文件中寻找这行注释,并解析这行注释,根据解析结果分别在/etc/rc.d/rc3.d;/etc/rc.d/rc4.d;/etc/rc.d/rc5.d中创建符号连接文件S99oracle11文件,这个文件是系统启动时要执行的,其实这个文件是指向/etc/init.d/oracle11的,启动的时候系统向这个文件发送一个start参数,也就执行了oracle11文件中的start分支了。还会在/etc/rc.d/rc0.d;/etc/rc.d
/rc1.d;/etc/rc.d/rc6.d中创建K10oracle11文件,这个文件时系统关闭时要执行的,其实这个文件也是指向/etc
/init.d/oracle11的,关闭的时候系统向这个文件发送一个stop参数,也就执行了oracle11文件中的stop分支了。
我想你应该明白#chkconfig:3459910中这些数字的含义了吧:指出3,4,5级别启动这个服务,99是在相应的/etc
/rc.d/rcN.d(N为前面指定的级别,这里是2345)目录下生成的链接文件的序号(启动优先级别)S99oracle11,10为在除前面指出的级别对应的/etc/rc.d/rcN.d(N为除2345之外的级别)目录生成的链接文件的序号(服务停止的优先级别)K10oracle11。至于为什么在这些目录中创建文件和文件的命名规则,这就要您对LINUX的系统启动流程有一个熟悉的了解了,在这就不详谈了。
其二:若您想尝试一下手动创建符号连接文件的乐趣,请执行如下命令:
#su
-root
ln -s /etc/init.d/oracle11 /etc/rc.d/rc3.d/S99oracle11
ln -s
/etc/init.d/oracle11 /etc/rc.d/rc4.d/S99oracle11
ln -s /etc/init.d/oracle11
/etc/rc.d/rc5.d/S99oracle11
作用效果和执行chkconfig --add
oracle11是一样的。
重启之后看看/var/lock/subsys/目录下的oracle11log文件,里面是不是有脚本的启动分支输出信息呢?