在 Oracle® Solaris 11.2 中管理系统服务

退出打印视图

更新时间: 2014 年 7 月
 
 

创建用于启动或停止 Oracle 数据库实例的服务

本示例介绍了用于帮助管理 Oracle 数据库的以下服务:

  • 用于启动或停止 Oracle 数据库实例的数据库服务

  • 用于启动侦听器的侦听器服务,这是管理数据库实例的客户机连接请求传入通信的进程。

此示例使用由文件提供支持的存储。除了使用由文件提供支持的存储以外,还可以使用自动存储管理 (Automatic Storage Management, ASM) 功能。ASM 是一个卷管理器,也是一个适用于 Oracle 数据库文件的文件系统。

每次安装 Oracle 数据库时,都必须设置以下环境变量:

ORACLE_HOME

安装数据库的位置。在本节的示例中,数据库的安装位置为 /opt/oracle/product/home

ORACLE_SID

系统中唯一标识特定数据库的系统 ID。

在此示例中,这些环境变量都在服务清单中设置,并且在方法脚本中使用。

数据库启动和停止服务

本节介绍 Oracle 数据库实例如何控制服务清单 /lib/svc/manifest/site/oracle.xml。以下是需要了解的有关此服务清单的一些功能:

  • 定义了一个名为 svc:/site/application/database/oracle:default 的服务实例。缺省情况下,此实例处于启用状态。

    此示例介绍了定义缺省实例的两种方法。在此示例中,缺省实例定义在清单顶部的 create_default_instance 元素中。清单底部的 instance 元素提供了执行此操作的其他方法。

  • 此服务需要挂载所有本地文件系统以及初始化所有网络接口。

    如果您使用的是由文件提供支持的数据库,则数据库服务应该依赖于本地文件系统。如果您使用的是 ASM,则数据库服务应该依赖于管理 ASM 的服务。数据库服务应该依赖于网络以实现远程客户机连接。

  • method_context 元素中的 method_environment 元素定义 ORACLE_HOMEORACLE_SID 环境变量,用于标识要启用或停止的数据库实例。然后这些值可用于要使用的方法脚本。

    如果您创建此服务的多个实例(请参见清单底部的 instance 元素),则每个实例可能都需要有自己的 method_context 元素,以便为该特定数据库定义唯一的 ORACLE_HOMEORACLE_SID 值。

  • 除了此示例中所示的项目和工作目录之外,method_context 元素的属性还可以定义资源池。您还可以在 method_context 元素中定义 method_profilemethod_credential 元素。除了此示例中所示的 usergroupprivileges 值之外,method_credential 元素还可以指定 supp_groupslimit_privileges 值。有关更多信息,请参见 DTD。

  • start/stop 方法脚本为 /lib/svc/method/oracle。在缺省值的基础上增加了方法超时前的秒数。

  • 用户必须获得 solaris.smf.manage.oracle 授权才能启用或禁用此服务实例。在此示例中,用户 oracle 获得了 solaris.smf.manage.oracle 授权。

<?xml version="1.0"?>

<!--
 Define a service to control the startup and shutdown of a database instance.
-->

<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type="manifest" name="oracle">
<service name="site/application/database/oracle" type="service" version="1">
    <create_default_instance enabled="true" />

    <!--
         Wait for all local file systems to be mounted.
         Wait for all network interfaces to be initialized.
    -->

    <dependency type="service"
        name="fs-local"
        grouping="require_all"
        restart_on="none">
        <service_fmri value="svc:/system/filesystem/local" />
    </dependency>

    <dependency type="service"
        name="network"
        grouping="require_all"
        restart_on="none">
        <service_fmri value="svc:/milestone/network:default" />
    </dependency>

    <!-- Define the methods. -->

    <method_context project=":default" working_directory=":default">
        <method_credential user="oracle" group="dba" privileges=":default" />
        <method_environment>
            <envvar name="ORACLE_HOME" value="/opt/oracle/product/home" />
            <envvar name="ORACLE_SID" value="oracle" />
        </method_environment>
    </method_context>

    <exec_method type="method"
        name="start"
        exec="/lib/svc/method/oracle start"
        timeout_seconds="120"/>

    <exec_method type="method"
        name="stop"
        exec="/lib/svc/method/oracle stop"
        timeout_seconds="120" />

    <!--
         What authorization is needed to allow the framework
         general/enabled property to be changed when performing the
         action (enable, disable, etc) on the service.
    -->

    <property_group name="general" type="framework">
        <propval type="astring"
            name="action_authorization"
            value="solaris.smf.manage.oracle" />
    </property_group>

    <!-- Define an instance of the database. -->

    <!--<instance name="default" enabled="true" />-->

    <stability value="Evolving" />
</service>
</service_bundle>

将名称和说明元数据添加到清单中,以便用户可以通过 svcssvccfg describe 命令获得有关此服务的信息。请参见 DTD 中的 template 元素。

使用 svccfg validate 命令确保服务清单有效。

下面是 Oracle 数据库实例控制服务的 start/stop 方法脚本 /lib/svc/method/oracle。此方法将调用数据库 dbstartdbshut 命令。

#!/bin/ksh -p

. /lib/svc/share/smf_include.sh

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

function startup
{
        dbstart $ORACLE_HOME
}

function shutdown
{
        dbshut $ORACLE_HOME
}

case $1 in
    start) startup ;;
    stop)  shutdown ;;

    *) echo "Usage: $0 { start | stop }" >&2
       exit $SMF_EXIT_ERR_FATAL
       ;;
esac

exit $SMF_EXIT_OK

数据库侦听器服务

侦听器是管理数据库实例的客户机连接请求传入通信的进程。侦听器服务依赖于它正在管理其客户机连接的数据库服务实例。

本节说明 Oracle 数据库实例侦听器服务清单 /lib/svc/manifest/site/listener.xml。以下是需要了解的有关此服务清单的一些功能:

  • 定义了一个名为 svc:/site/application/database/listener:default 的服务实例。缺省情况下,此实例处于启用状态。

  • 此服务需要 Oracle 数据库实例控制服务 svc:/site/application/database/oracle 才能启动。如果数据库实例由于某种原因而重新启动,则侦听器也将重新启动。

  • method_context 元素中的 method_environment 元素定义 ORACLE_HOMEORACLE_SID 环境变量,用于标识要启用或停止的数据库实例。然后这些值可用于要使用的方法脚本。

    如果您创建此服务的多个实例(请参见清单底部的 instance 元素),则每个实例可能都需要有自己的 method_context 元素,以便为该特定数据库定义唯一的 ORACLE_HOMEORACLE_SID 值。

  • 除了此示例中所示的项目和工作目录之外,method_context 元素的属性还可以定义资源池。您还可以在 method_context 元素中定义 method_profilemethod_credential 元素。除了此示例中所示的 usergroupprivileges 值之外,method_credential 元素还可以指定 supp_groupslimit_privileges 值。有关更多信息,请参见 DTD。

  • start/stop 方法脚本为 /lib/svc/method/listener。在缺省值的基础上增加了方法超时前的秒数。

  • 用户必须获得 solaris.smf.manage.oracle 授权才能启用或禁用此服务实例。

  • 服务为 transient 服务。请参见服务模型

<?xml version="1.0"?>

<!--
 Define a service to control the startup and shutdown of a database listener.
-->

<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type="manifest" name="listener">
<service name="site/application/database/listener" type="service" version="1">
    <create_default_instance enabled="true" />
    <!--<single_instance />-->

    <!-- Wait for the database to be started. -->

    <dependency type="service"
        name="oracle"
        grouping="require_all"
        restart_on="refresh">
        <service_fmri value="svc:/site/application/database/oracle" />
    </dependency>

    <!-- Define the methods. -->

    <method_context project=":default" working_directory=":default">
        <method_credential user="oracle" group="dba" privileges=":default" />
        <method_environment>
            <envvar name="ORACLE_HOME" value="/opt/oracle/product/home" />
            <envvar name="ORACLE_SID" value="oracle" />
        </method_environment>
    </method_context>

    <exec_method type="method"
        name="start"
        exec="/lib/svc/method/listener start"
        timeout_seconds="150"/>

    <exec_method type="method"
        name="stop"
        exec="/lib/svc/method/listener stop"
        timeout_seconds="30" />

    <!--
         What authorization is needed to allow the framework
         general/enabled property to be changed when performing the
         action (enable, disable, etc) on the service.
    -->

    <property_group name="general" type="framework">
        <propval type="astring"
            name="action_authorization"
            value="solaris.smf.manage.oracle" />
    </property_group>

    <!-- Make the instance transient (since it backgrounds itself). -->

    <property_group name="startd" type="framework">
        <propval name="duration" type="astring" value="transient" />
    </property_group>

    <!-- Define an instance of the listener. -->

    <!--<instance name="default" enabled="true" />-->

    <stability value="Evolving" />
</service>
</service_bundle>

将名称和说明元数据添加到清单中,以便用户可以通过 svcssvccfg describe 命令获得有关此服务的信息。请参见 DTD 中的 template 元素。

下面是 Oracle 数据库实例侦听器服务的 start/stop 方法脚本 /lib/svc/method/listener。此方法将启动或停止侦听器进程 lsnrctl。当 lsnrctl 启动时,它会测试数据库服务的状态。

#!/bin/ksh -p

. /lib/svc/share/smf_include.sh

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

function startup
{
        lsnrctl start

        # Wait for the listener to report ready.

        i=0
        while ! lsnrctl status | grep -i ready ; do
                ((i = i+1))
                if (( $i == 120 )) ; then
                        # It's been *at least* 2 minutes, time to give up.
                        echo "The listener failed to report ready." >&2
                        exit $SMF_EXIT_ERR_FATAL
                fi

                sleep 1
        done

        # Ping the database once to prove it is now available.

        if ! tnsping $ORACLE_SID ; then
                exit $SMF_EXIT_ERR_FATAL
        fi
}

function shutdown
{
        lsnrctl stop
}

case $1 in
    start) startup ;;
    stop)  shutdown ;;

    *) echo "Usage: $0 { start | stop }" >&2
       exit $SMF_EXIT_ERR_FATAL
       ;;
esac

exit $SMF_EXIT_OK