ORACLE11g随RHEL5系统自动启动与关闭的设置方法

写好脚本,注册好服务之后,经测试,oracle可以随rhel启动而启动,但不能随系统关闭而关闭。在网上找答案,发现几乎所有的设置过程帖子都是从同一篇原样照抄过来的,根本就行不通。天下文章一大抄。求助他人,没有得到一个好的解决方案。无奈,自己静下心来慢慢研究分析,总算找到了问题的关键原因所在。

现在就把我的整个成功设置的过程贴出来,供大家参考,以期大家能少走弯路;另外还是要给其他人一个建议:切莫生硬照搬,断章取义,否则其害大焉!!

首先,要在rhel中设置允许oracle系统自动启动,因为默认情况下是设置为不允许的。操作如下:

在root账户下修改/etc/oratab 文件:

# vi /etc/oratab

找到orcl=/db/app/oracle/product/11.1.0/db_1 :n这一行

改为:

orcl=/db/app/oracle/product/11.1.0/db_1 :y

也就是将最后的n改为y,意思是将不允许自动启动改为允许自动启动。

然后,是修改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的这个参数。这里就不再详细写出了,他们在同一个目录下。

再次,就是写一个脚本,把它注册为一个系统服务,让它在开机与关机的时候运行。它的作用就是调用并执行dbstart和dbshut。这样不

就实现了数据库启动与关闭了吗?!这个脚本被放在/etc/init.d目录中,脚本的名字是oracle11

脚本如下:


复制代码 代码如下:

#!/bin/bash

# chkconfig: 2345 99 10

# description: startup script for oracle databases

# /etc/rc.d/init.d/oradbstart

export oracle_base=/db/app/oracle/

export oracle_home=/db/app/oracle/product/11.1.0/db_1

export oracle_sid=orcl

export path=$path:$oracle_home/bin

case “$1” in

start)

echo “—–startup oracle—–” >> /var/log/oracle11log

su oracle -c $oracle_home/bin/dbstart

touch /var/lock/subsys/oracle11

echo “—–startup oracle successful—–” >> /var/log/oracle11log

echo “ok”

stop)

echo “—–shutdwn oracle—–” >> /var/log/oracle11log

su oracle -c $oracle_home/bin/dbshut

rm -f /var/lock/subsys/oracle11

echo “—–shutdown oracle successful—–” >> /var/log/oracle11log

echo “ok”

*)

echo “usage: ‘basename $0’ start|stop”

exit 1

esac

exit 0

保存并退出。

现在,我要对这段脚本做一个关键解释:

第一:# chkconfig: 2345 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的启动与关闭脚本也是这样做的,最终恍然大悟。原来如此。这个地方请大家注意了。

最后,就是将这个脚本注册成为一个系统服务就可以了,方法有二:

其一:先给脚本分配可以被执行的权限。执行下面命令:


复制代码 代码如下:

#su – root

chown oracle /etc/init.d/oracle11

chmod 775 /etc/init.d/oracle11

再创建符号链接文件。

chkconfig –add /etc/init.d/oracle11,执行这个命令就需要你在脚本中写上# chkconfig: 2345 99 10 了。这样当这个命令被执行的时候,回去oracle11文件中寻找这行注释,并解析这行注释,根据解析结果分别在/etc/rc.d/rc2.d;/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: 2345 99 10 中这些数字的含义了吧:指出2,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/rc2.d/s99oracle11

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

ln -s /etc/init.d/oracle11 /etc/rc.d/rc0.d/k10oracle11

ln -s /etc/init.d/oracle11 /etc/rc.d/rc1.d/k10oracle11

ln -s /etc/init.d/oracle11 /etc/rc.d/rc6.d/k10oracle11

作用效果和执行chkconfig –add oracle11是一样的。

到此,所以得设置过程就结束了,下面进行一下测试吧:


复制代码 代码如下:

#cd /etc/init.d

sh oracle11 start

执行后,看看/var/log目录下的oracle11log文件,里面是不是有脚本的启动分支输出信息呢?

sh oracle11 stop

执行后,看看/var/log目录下的oracle11log文件,里面是不是有脚本的关闭分支输出信息呢?

若看到信息,表示您设置成功了。若没有,请再仔细设置一遍,并注意文件的权限问题。linux的用户概念是很严格的。毕竟是多用户系统嘛。

文章属于作者原创,转载请注明出处。

来自:

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐