暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从oracle自启动服务我们能学到什么

1671

很多时候我们需要将程序服务在操作系统启动后能够自动启动,当有了这样的配置,一方面可以简化维护,另外一方面一旦系统出现问题重启后也会启动这些服务,不影响业务。


今天我们就从这部分功能配置出发,通过oracle自启动服务来学习相关知识

一、服务逻辑原理

1、脚本文件


我们需要提供一个服务启动配置脚本,这个shell脚本格式后面我们会拿oracle的启动服务脚本oracledb_ORCLCDB-19c讲,脚本文件需要放到/etc/init.d下面


2、使用命令


service命令

linux 6之前的版本都使用这个命令管理服务

servcie iptables start --启动防火墙

servcie iptables stop --关闭防火墙

servcie iptables status --查看防火墙

servcie iptables restart --重启防火墙


chkconfig命令

linux 6之前的版本都使用这个命令管理服务


chkconfig -add httpd             --增加httpd服务

chkconfig -del httpd              --删除httpd服务

chkconfig -list mysqld           --列出mysqld服务设置情况

chkconfig  mysqld on             --永久设定开机运行服务

   chkconfig mysqld off              --永久设定开机不运行服务 


systemctl命令

linux 7之后的版本都使用这个命令管理服务

systemctl stop firewalld.service   --关闭防火墙命令

systemctl start firewalld.service   --开启防火墙

systemctl restart  firewalld.service  --重启防火墙

systemctl status  firewalld.service  --查看防火墙

systemctl disable firewalld.service  --关闭开机自启动

systemctl enable firewalld.service  --开启开机启动


二、oracledb_ORCLCDB-19c内容

#!/bin/bash

#

# chkconfig: 2345 80 05

# Description: This script is responsible for taking care of configuring the Oracle Datab

ase and its associated services.


case $PATH in

        "") PATH=/bin:/usr/bin:/sbin:/etc

                 export PATH ;;

esac


if [ $(id -u) != "0" ]

then

        echo "You must be root user to run the configurations script. Login as root user 

and try again."

        exit 1

fi


export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 


export ORACLE_VERSION=19c 

export ORACLE_SID=ORCLCDB

export TEMPLATE_NAME=General_Purpose.dbc

export CHARSET=AL32UTF8

export PDB_NAME=ORCLPDB1

export LISTENER_NAME=LISTENER

export NUMBER_OF_PDBS=1

export CREATE_AS_CDB=true


export PATH=$ORACLE_HOME/bin:$PATH

LSNR=$ORACLE_HOME/bin/lsnrctl

SQLPLUS=$ORACLE_HOME/bin/sqlplus

DBCA=$ORACLE_HOME/bin/dbca

NETCA=$ORACLE_HOME/bin/netca

ORACLE_OWNER=oracle

RETVAL=0

CONFIG_NAME="oracledb_$ORACLE_SID-$ORACLE_VERSION.conf"

CONFIGURATION="/etc/sysconfig/$CONFIG_NAME"


if [ -z "$SU" ];then SU=/bin/su; fi

if [ -z "$GREP" ]; then GREP=/usr/bin/grep; fi

if [ ! -f "$GREP" ]; then GREP=/bin/grep; fi


start()

{

    check_for_configuration

    RETVAL=$?

    if [ $RETVAL -eq 1 ]

    then

        echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$

ORACLE_SID-$ORACLE_VERSION configure' as the root user to configure the database."

        exit

    fi

    pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`

    if [ "$pmon" = "" ];

    then


        unset_proxy_vars


        echo "Starting Oracle Net Listener."

        $SU -s bin/bash $ORACLE_OWNER -c "$LSNR  start $LISTENER_NAME" > dev/null 2>&1

        RETVAL=$?

        if [ $RETVAL -eq 0 ]

        then

            echo "Oracle Net Listener started."

        fi


        echo "Starting Oracle Database instance $ORACLE_SID."

        $SU -s bin/bash  $ORACLE_OWNER -c "$SQLPLUS -s nolog << EOF

                                                                connect as sysdba

                                                                startup

                                                                alter pluggable database 

all open

                                                                exit;

                                                                EOF" > dev/null 2>&1

        RETVAL1=$?

        if [ $RETVAL1 -eq 0 ]

        then

            echo "Oracle Database instance $ORACLE_SID started."

        fi

    else

        echo "The Oracle Database instance $ORACLE_SID is already started."

        exit 0

    fi


    echo

    if [ $RETVAL -eq 0 ] && [ $RETVAL1 -eq 0 ]

    then

        return 0

     else

        echo "Failed to start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr and Orac

le Database using $ORACLE_HOME/bin/sqlplus."

        exit 1

    fi

}


stop()

{

    check_for_configuration

    RETVAL=$?

    if [ $RETVAL -eq 1 ]

    then

        echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$

ORACLE_SID-$ORACLE_VERSION configure' as the root user to configure the database."

        exit 1

    fi

    pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`

    if [ "$pmon" = "" ]

    then

        echo "Oracle Database instance $ORACLE_SID is already stopped."

        exit 1

    else


        unset_proxy_vars


        echo "Shutting down Oracle Database instance $ORACLE_SID."

        $SU -s bin/bash $ORACLE_OWNER -c "$SQLPLUS -s nolog << EOF

                                                                connect as sysdba

                                                                shutdown immediate

                                                                exit;

                                                                EOF" > dev/null 2>&1

        RETVAL=$?

        if [ $RETVAL -eq 0 ]

        then

            echo "Oracle Database instance $ORACLE_SID shut down."

        fi


        echo "Stopping Oracle Net Listener."

        $SU -s bin/bash  $ORACLE_OWNER -c "$LSNR stop $LISTENER_NAME" > dev/null 2>&1

        RETVAL1=$?

        if [ $RETVAL1 -eq 0 ]

        then

            echo "Oracle Net Listener stopped."

        fi

    fi


    echo

    if [ $RETVAL -eq 0 ] && [ $RETVAL1 -eq 0 ]

    then

        return 0

    else

        echo "Failed to stop Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr and Oracl

e Database using $ORACLE_HOME/bin/sqlplus."

        exit 1

    fi

}


configure_perform()

{

    unset_proxy_vars


    echo "Configuring Oracle Database $ORACLE_SID."


    $SU -s bin/bash  $ORACLE_OWNER -c "$DBCA -silent -createDatabase -gdbName $ORACLE_SI

D -templateName $TEMPLATE_NAME -characterSet $CHARSET -createAsContainerDatabase $CREATE_

AS_CDB -numberOfPDBs $NUMBER_OF_PDBS -pdbName $PDB_NAME -createListener $LISTENER_NAME:$L

ISTENER_PORT -datafileDestination $ORACLE_DATA_LOCATION -sid $ORACLE_SID -autoGeneratePas

swords -emConfiguration DBEXPRESS -emExpressPort $EM_EXPRESS_PORT"


    RETVAL=$?


    echo

    if [ $RETVAL -eq 0 ]

    then

        echo "Database configuration completed successfully. The passwords were auto gene

rated, you must change them by connecting to the database using 'sqlplus as sysdba' as 

the oracle user."

        return 0

    else

        echo "Database configuration failed."

        exit 1

    fi

}


unset_proxy_vars()

{

    if [ "$http_proxy" != "" ]

    then

        unset http_proxy

    fi


    if [ "$HTTP_PROXY" != "" ]

    then

        unset HTTP_PROXY

    fi


    if [ "$https_proxy" != "" ]

    then

        unset https_proxy

    fi


    if [ "$HTTPS_PROXY" != "" ]

    then

        unset HTTPS_PROXY

    fi

}


check_for_configuration()

{

    configfile=`$GREP --no-messages $ORACLE_SID:$ORACLE_HOME etc/oratab` > dev/null 2>&

1

    if [ "$configfile" = "" ]

    then

        return 1

    fi

    return 0

}


read_config_file()

{

    if [ -f "$CONFIGURATION" ]

    then

        . "$CONFIGURATION"

    else

        echo "The Oracle Database is not configured. Unable to read the configuration fil

e '$CONFIGURATION'"

        exit 1;

    fi

}


configure()

{

    check_for_configuration

    RETVAL=$?

    if [ $RETVAL -eq 0 ]

    then

        echo "Oracle Database instance $ORACLE_SID is already configured."

        exit 1

    fi

    read_config_file

    check_port_availability

    check_em_express_port_availability

    configure_perform

}


check_port_availability()

{

    port=`netstat -n --tcp --listen | $GREP :$LISTENER_PORT`

    if [ "$port" != "" ]

    then

        echo "Port $LISTENER_PORT appears to be in use by another application. Specify a 

different port in the configuration file '$CONFIGURATION'"

        exit 1;

    fi

}


check_em_express_port_availability()

{

    port=`netstat -n --tcp --listen | $GREP :$EM_EXPRESS_PORT`

        if [ "$port" != "" ]

    then

         echo "Port $EM_EXPRESS_PORT appears to be in use by another application. Specify

 a different Oracle EM Express port in the configuration file '$CONFIGURATION'"

         exit 1;

    fi

}


restart()

{

    pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`

    if [ "$pmon" = "" ]

    then

        start

    else

        stop

        start

    fi

}


configure_delete()

{

    unset_proxy_vars

    ORABASE=`$ORACLE_HOME/bin/orabase`

    NETCA_LOG_DIR="$ORABASE/cfgtoollogs/netca"

    LSNR_CONFIG_FILE="$ORACLE_HOME/network/admin/listener.ora"

    if [ ! -d "$NETCA_LOG_DIR" ]

    then

       $SU -s bin/bash $ORACLE_OWNER -c "$MKDIR_CMD -p $NETCA_LOG_DIR"

    fi

    NETCA_LOG="$NETCA_LOG_DIR/netca_deinst_out.log"


    echo "Detecting existing Listeners..."

    if [ -f "$LSNR_CONFIG_FILE" ]

    then

      NUMBER_OF_LISTENERS=`grep -w "DESCRIPTION_LIST" $LSNR_CONFIG_FILE | wc -l`

      if [ "$NUMBER_OF_LISTENERS" == "1" ]

      then

        echo "Deleting Oracle Listener...."

        $SU -s /bin/bash $ORACLE_OWNER -c "$LSNR  stop $LISTENER_NAME" > /dev/null 2>&1

        $SU -s /bin/bash $ORACLE_OWNER -c "$NETCA /deinst >>$NETCA_LOG"

      else

        if [ "$NUMBER_OF_LISTENERS" != "0" ]

        then

          echo "There were more Listeners detected. Verify and remove them manually so th

e service can be safely deleted"

          exit

        else

          echo "No Listeners were detected. Proceeding with Database removal"

        fi

      fi

    else

      echo "No Listener configuration file found. Proceeding with Database removal"

    fi


    echo "Detecting existing Oracle Databases..."

    check_for_configuration

    RETVAL=$?

    if [ $RETVAL -eq 0 ]

    then

      echo "Deleting Oracle Database $ORACLE_SID."

      $SU -s /bin/bash  $ORACLE_OWNER -c "$DBCA -silent -deleteDatabase -sourceDB $ORACLE

_SID -skipSYSDBAPasswordPrompt true"

    else

      echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$OR

ACLE_SID-@<DBNRMAJVSNLETTER_STR>@ configure' as the root user to configure the database"

      exit

    fi

}


case "$1" in

    start)

        start

    ;;

    stop)

        stop

    ;;

    configure)

        configure

    ;;

    delete)

        configure_delete

    ;;

    restart)

        restart

    ;;

    *)

        echo $"Usage: $0 {start|stop|restart|configure|delete}"

        exit 1

    ;;

esac


exit 0


三、脚本要点说明

1、重点代码说明

#!/bin/bash

    # chkconfig: 2345 80 05

    # Description: This script is responsible for taking care of configuring the Oracle               Database and its associated services.


这三行代码非常重要,第一行是sh脚本必须的,说明使用什么sh来运行这个脚本,第二行是配置了三个参数,2345是运行级别,80是开机顺序,05是关机顺序。对于没有前置任务和系统运行级别要求的程序,可以参考这个设置即可。


2、使用函数确保程序可读性

 case "$1" in

     start)

        start

       ;;

      stop)

        stop

       ;;

       configure)

        configure

       ;;

        delete)

        configure_delete

       ;;

       restart)

        restart

        ;;

       *)

        echo $"Usage: $0 {start|stop|restart|configure|delete}"

        exit 1

        ;;

       esac

通过程序第一个参数来调用不同函数,这就是我们运维命令参数来实现启停的逻辑。


3、有大量的环境变量检测,确保脚本可执行

# Setting the required environment variables

     export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 

     export ORACLE_VERSION=19c 

     export ORACLE_SID=ORCLCDB

     export TEMPLATE_NAME=General_Purpose.dbc

     export CHARSET=AL32UTF8

     export PDB_NAME=ORCLPDB1

     export LISTENER_NAME=LISTENER

     export NUMBER_OF_PDBS=1

     export CREATE_AS_CDB=true

     case $PATH in

        "") PATH=/bin:/usr/bin:/sbin:/etc

                 export PATH ;;

     esac


     # Check if the root user is running this script

     if [ $(id -u) != "0" ]

     then

        echo "You must be root user to run the configurations script. Login as root user        and try again."

        exit 1

      fi


确保脚本执行的环境变量检测,一旦没有,就需要自己设置,比如程序需要root运行执行,就需要检查当前用户是否为root,另外后面需要调用很多系统命令比如ps,grep,因此检测PATH环境变量,如果没有就需要设置。


通过这部分的分析,我们看到的脚本自身健壮性对维护的重要性。


4、脚本运行返回值


exit 0;

如果程序能正常运行结束,需要返回0,这样方便别的shell检测是否正常运行

exit 1;

如果在执行过程中出现任何的错误,就需要返回1。



                       


最后修改时间:2020-01-03 09:20:59
文章转载自数据库平台优化,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论