oracle学习笔记 Oracle数据库及相关软件的启动和关闭 第二部分

oracle学习笔记

Oracle数据库及相关软件的启动和关闭

第二部分 附录 oracle的随机启动和关闭

虽然知道了oracle的启动和关闭方法,但是这时如果重新启动系统,你会发现这些软件默认状态都没有运行,
必须重新手动启动一遍,这样显得非常麻烦,下面介绍一下如何实现它们随系统启动而启动。

一)oracle软件随机自动运行

数据库的启动关闭,安装数据库时,给我们了脚本
分别是 $ORACLE_HOME/bin/目录下的dbstart和dbshut文件,
这两个文件属于oracle用户,要以oracle用户身份运行。

执行dbstart可以启动监听和数据库,执行dbshut只能关闭数据库,不能关闭监听。

默认状态这两个文件中的主要部分代码是得不到执行的,
因为代码中有判断$ORATAB值的语句,只有此值为真,才可以进一步向下执行,
而它后面的语句是打开或关闭数据库的语句。
它的值来自于系统文件
/etc/oratab中的一个唯一非注释行
jiagulun:/u01/app/oracle/product/10.2.0/db_1:N
它的格式是$ORACLE_SID:$ORACLE_HOME:<N|Y>:
这行第二个:号前的部分因环境不同会不一样,我们不用管它,因为它默认给的值肯定是对的
只需将最后面的N改成Y即可:
jiagulun:/u01/app/oracle/product/10.2.0/db_1:Y
修改后dbstart和dbshut中判读$ORATAB值的语句为真,所有代码就可以得到执行了。

在执行dbstart时
一般情况可启动数据库但监听是得不到运行的,因为它初始情况下一个参数给的值往往是不对的
在dbstart文件中可以找到类似
ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle
的行,将它的值改为
ORACLE_HOME_LISTNER=$ORACLE_HOME
这样dbstart文件才能找到lsnrctl命令,
如此修改后dbstart执行时会即打开数据库又开启监听。

分析代码可发现dbstart文件中启动顺序是先启动监听,再启动数据库。
在dbshut文件中没有对监听的操作。

这样要随机启动,只需在系统启动时执行dbstart文件即可:
需以root身份修改/etc/rc.d/rc.local文件
添加下行:
su oracle -lc /u01/app/oracle/product/10.2.0/db_1/bin/dbstart

/u01/app/oracle/product/10.2.0/db_1是本机oracle用户的$ORACLE_HOME参数值

重启redhat,成功自动启动监听和数据库。

总结:
1、
修改/etc/oratab文件
jiagulun:/u01/app/oracle/product/10.2.0/db_1:Y
2、
修改$ORACLE_HOME/bin/dbstart文件
ORACLE_HOME_LISTNER=$ORACLE_HOME
3、
修改/etc/rc.d/rc.local文件
添加:
su oracle -lc /u01/app/oracle/product/10.2.0/db_1/bin/dbstart

oracle软件随机自动运行操作完成。


二)oracle开机自动启动并且关机自动关闭

上面成功的实现了开机启动oracle,
但存在一个问题,按上面的设置关机时没有自动关闭oracle,
如果在关机时,没有手动关闭oracle及相关软件,
系统会强制杀死所有oracle进程,这样的话在生产环境中是不合理的和不安全的,所以要加入关机的操作。

从网上找到了实现开机启动关机关闭的全自动方法。
自己对代码进行修改并达到了目的。

编写的代码中加有开机启动监听,所以在dbstart运行时就不运行lsnrctl start了,
就是不修改原始dbstart文件了,这样在它运行的时候,就不去启动监听了。

整个过程要以root身份执行

实现过程:

1、使dbstart、dbshut可运行
修改/etc/oratab文件
jiagulun:/u01/app/oracle/product/10.2.0/db_1:Y

2、创建oraclescript文件
[root@redhat4 init.d]# pwd
/etc/rc.d/init.d
[root@redhat4 init.d]# touch oraclescript
改变文件权限,将此文件置为可执行文件
[root@redhat4 init.d]# chmod 755 oraclescript

3、编辑oraclescript文件

——————————————————————————————————————————————————————————
#!/bin/sh
#chkconfig: 2345 22 01
#description: oracle dbstart / dbshut
#The front tow lines is must for chkconfig!


ORA_HOME=/u01/app/oracle/product/10.2.0/db_1
ORA_OWNER=oracle
LOGFILE=/var/log/oraclelog.log
ORACLE_LOCK=/var/lock/subsys/oraclescript


echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>run oraclescript>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" >> ${LOGFILE}


echo "#################################" >> ${LOGFILE}
date +"### %T %a %D: Run Oracle" >> ${LOGFILE}


if [ ! -f ${ORA_HOME}/bin/dbstart ] || [ ! -f ${ORA_HOME}/bin/dbshut ]; then
    echo "Error: Missing the script file ${ORA_HOME}/bin/dbstart or ${ORA_HOME}/bin/dbshut!" >> ${LOGFILE}
    echo "#################################" >> ${LOGFILE}
    exit
fi


start(){
    echo "!!!!!!Start Database Listeners...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/lsnrctl start"
    echo "!!!Done."


    echo "!!!!!!Startup Database...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/dbstart ${ORA_HOME}"
    echo "!!!Done."


    echo "!!!!!!Run database control...!!!!!!!!!!!!!!!!!!!!!!!!!"
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/emctl start dbconsole"
    echo "!!!Done."


    echo "!!!!!!Start iSql*Plus...!!!!!!!!!!!!!!!!!!!!!!!!!"
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/isqlplusctl start"
    echo "!!!Done."


    touch ${ORACLE_LOCK}
}


stop(){
    echo "!!!!!!Stop iSql*Plus...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/isqlplusctl stop"
    echo "!!!Done."


    echo "!!!!!!Stop database control...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/emctl stop dbconsole"
    echo "!!!Done."


    echo "!!!!!!Stop Database Listeners...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/lsnrctl stop"
    echo "!!!Done."


    echo "!!!!!!Shutdown Database...!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOGFILE}
    su - ${ORA_OWNER} -c "${ORA_HOME}/bin/dbshut ${ORA_HOME}"
    echo "!!!Done."
    
    rm -f ${ORACLE_LOCK}
}


case "$1" in
    'start')
        echo "@@@@@@@@@@@@@  Starting Database...starting......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" >> ${LOGFILE}
        start >> ${LOGFILE}
    ;;
    'stop')
        echo "@@@@@@@@@@@@@  Stop Database...stop......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" >> ${LOGFILE}
        stop >> ${LOGFILE}
    ;;
    'restart')
        echo "@@@@@@@@@@@@@  Restart... Database...restart.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" >> ${LOGFILE}
        stop >> ${LOGFILE}
        start >> ${LOGFILE}
    ;;
esac
date +"### %T %a %D: Finished." >> ${LOGFILE}
echo "#################################" >> ${LOGFILE}
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end oraclescript>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" >> ${LOGFILE}
echo "" >> ${LOGFILE}
echo "" >> ${LOGFILE}
echo "" >> ${LOGFILE}
echo "" >> ${LOGFILE}
echo "" >> ${LOGFILE}
echo "" >> ${LOGFILE}


——————————————————————————————————————————————————————————————————————
代码中

第二行和第三行
#chkconfig: 2345 22 01
#description: Oracle dbstart / dbshut
在运行chkconfig时要使用必须有。

第三行是此服务的描述
在系统设置中服务配置中,已有服务会有此描述的显示。

ORA_HOME=/u01/app/oracle/product/10.2.0/db_1
ORA_OWNER=oracle
根据自己的情况决定。
ORA_HOME和oracle用户的环境变量$ORACLE_HOME一样
ORA_OWNER是oracle数据库所有者的系统用户名。

LOGFILE=/var/log/oraclelog.log
自己建的一个日志文件接收oraclescript脚本运行过程中输出信息。

主体部分是运行这个脚本时的主题工作,包括数据库和相关软件的启动和关闭的代码。

至此,可以root身份使用如下命令对oracle数据库进行启动和关闭

/etc/init.d/oraclescript start #启动oracle数据库
/etc/init.d/oraclescript stop #关闭oracle数据库
/etc/init.d/oraclescript restart #重启oracle数据库

oraclescript文件是以root身份编写的程序,里面用到的命令都是要以root身份运行的,
用oracle身份运行,文件里很多语句无法执行,会出现中途跳出。

同时也可以root身份使用如下命令对oracle的启动或关闭进行管理

service oraclescript start #启动数据库
service oraclescript stop #关闭数据库
service oraclescript restart #重启数据库

不要试着用oracle身份运行service,会提示它无法运行service命令。

4、向开机级别中添加服务
新服务需在/etc/rc.d/init.d文件夹中创建新可执行文件,上面已创建oraclescript

要开机和关机时运行需把它加到开机级别中

linux系统有7个开机级别:
      等级0表示:表示关机
      等级1表示:单用户模式
      等级2表示:无网络连接的多用户命令行模式
      等级3表示:有网络连接的多用户命令行模式
      等级4表示:不可用
      等级5表示:带图形界面的多用户模式
      等级6表示:重新启动

对应系统的7个开机级别,
在/etc/rc.d目录下,有rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d 七个目录。

在相应的开机级别状态下会运行对应子目录中所包含文件对应的服务。

开机级别子目录下文件名格式有 S**服务名 和 K**服务名 
大写S开头的文件运行时向对应服务名的服务传递start参数
大写K开头的文件运行时向对应服务名的服务传递stop参数

使用chkconfig命令将/etc/init.d/目录下的脚本添加为服务
[root@redhat4 ~]# chkconfig --add oraclescript
或者
[root@redhat4 ~]# chkconfig --level 35 oraclescript on

--add选项,添加oraclescript服务,并自动设置运行级别,
其设置依据是oracle文件第二行 #chkconfig: 2345 22 01
2345是开机级别2345四个级别中设为开启,其它的级别都自动设为关闭。
在系统整个开机过程中第22个启动,关闭的顺序号为01。

--level选项,是手动设置每一个开关机级别中的运行
35是开关机级别3和级别5,on表示开启。其它未指出的级别不做任何操作。
这时在设定级别中的顺序号还是按 22 01 自动设置的。

全手动添加服务
添加启动项
[root@redhat4 ~]# ln -s /etc/init.d/oraclescript /etc/rc3.d/S22oraclescript
S22oraclescript S必须大写,若小写文件创建后无效并不创建服务,22是开机运行的顺序号,oraclescript为服务名。
rc3.d表示将文件添加到rc3.d目录。
关机运行
[root@redhat4 ~]# ln -s /etc/init.d/oraclescript /etc/rc0.d/K01oraclescript
K01oraclescript K必须大写,01为关机时执行的顺序号,oraclescript为服务名。
rc0.d表示将文件添加到rc0.d目录。

这三种方式操作后都会在系统服务中添加一个oraclescript服务。

若oraclescript服务已建立
在系统的 服务配置 中也可以对它的启动进行配置,
但只能修改开机级别中的345级别,对其它级别没有影响。
结果是在选择级别中建立S**oraclescript,开机顺序号为oraclescript文件中的默认。

5、一个特殊说明
你在代码中可以看到
ORACLE_LOCK=/var/lock/subsys/oraclescript
...
start(){
...
    touch ${ORACLE_LOCK}
}
stop(){
...
    rm -f ${ORACLE_LOCK}
}
这三行语句,不要觉得它们是多余的,若没有会出现错误。

/var/lock/subsys/文件夹内的文件,系统会认为文件对应服务当前正在运行。

若其中没有对应文件,系统关闭时会认为服务并没有运行,
即使在06级别添加了此服务而且服务在运行状态,关机时也不会执行对应服务脚本。

服务启动时,系统并不会向此文件夹自动添加文件,我们要自己想法添加。

每次启动后,关闭前就需要建立它,就有了touch ${ORACLE_LOCK}语句。

系统关闭时若subsys中有对应文件名,即使06级别没添加此服务,也会执行一次此脚本。
说明系统关闭时自动执行了subsys中的文件,还发现系统自动执行后会自动将其删除。

若subsys中有对应文件,而且06级别设置了服务,在关机时会先执行06级别内的脚本,
这时若不把subsys/ 内的对应文件删除,后面的关机过程,系统还会自动执行一次subsys文件夹中的服务并将其删除,
会造成关机时脚本执行了两次。
仔细看关机过程日志,发现06级中的执行为显式,subsys中的执行为隐式。
隐式指关机时无执行oracle脚本的显示,系统日志和引导日志的关机信息中也没有的记录。而显式则都有。

解决办法在06级别执行完oracle数据库的关闭后把/var/lock/subsys/oraclescript删除,
系统后面的关机过程系统就不会自动重新执行oraclescript一遍了。
就有了rm -f ${ORACLE_LOCK}语句。

6、补充
最终虽然开机和关机都会自动关闭这四个程序,但在系统启动时会明显拖慢开机速度,
如果你嫌开机慢,可以在对代码修改,如可以去掉其中start()函数中的启动em和isqlplus的代码,只启动监听和库。
而em和isqlplus,可在系统全面启动完后,用户再根据需要去手工启动这两个软件。

任何程序编写时都不可能是完美无缺的,特别是大型的软件总存在这样那样的问题。
它需要编程者一步步改进和完善。
如果产生错误是源代码的问题,对一个使用者来说是无能为力的。
oracle的em组件也是一样,前面出现了一个时区错误,这里在它启动和关闭时你也有可能碰到很多的报错,
为此oracle公司还专门发布了补丁,补丁序号为8350262,至于怎么修正它的错误,跑题太远,这里就不叙述了。

总结一下:
利用服务脚本自动启动关闭oracle的最简方法

1、修改/etc/oratab文件
jiagulun:/u01/app/oracle/product/10.2.0/db_1:Y

2、在/etc/rc.d/init.d目录创建并编写oraclescript文件
3、向开机级别中添加oraclescript服务
[root@redhat4 ~]# chkconfig --level 35 oraclescript on
[root@redhat4 ~]# chkconfig --level 06 oraclescript off

反复运行一切正常,查看日志文件/var/log/oraclelog.log,关机运行了oraclescript stop,开机运行了oraclescript start。
系统日志中也有相关记录。

oracle开机自动启动、关机自动关闭成功实现。

你可能感兴趣的:(oracle,数据库,oracle学习,red,甲骨文,hat)