Gestión de los servicios del sistema en Oracle® Solaris 11.2

Salir de la Vista de impresión

Actualización: Julio de 2014
 
 

Creación de un servicio para iniciar o detener una instancia de Oracle Database

En este ejemplo se presentan los siguientes servicios que ayudan a gestionar Oracle Database:

  • Un servicio de base de datos que inicia o detiene una instancia de Oracle Database.

  • Un servicio de listener que inicia el listener, que es un proceso que gestiona el tráfico entrante de las solicitudes de conexión cliente a la instancia de base de datos.

Este ejemplo usa almacenamiento de copia de seguridad en archivo. Una alternativa al uso de almacenamiento con copia de seguridad en archivo es utilizar la función Automatic Storage Management (ASM). ASM es un gestor de volumen y un sistema de archivo para archivos Oracle Database.

Las siguientes variables de entorno se deben definir para cada instalación de Oracle Database:

ORACLE_HOME

La ubicación donde está instalada la base de datos. En el ejemplo de esta sección, la ubicación de la instalación de la base de datos es /opt/oracle/product/home.

ORACLE_SID

El ID de sistemas para identificar de manera única una base de datos concreta en un sistema.

En este ejemplo, estas variables de entorno se establecen en los manifiestos de servicio y, a continuación, se utilizan en las secuencias de comandos de método.

Servicio de inicio y detención de base de datos

Esta sección muestra el manifiesto de servicio de control de instancia de Oracle Database, /lib/svc/manifest/site/oracle.xml. Las siguientes son algunas funciones a tener en cuenta acerca de este manifiesto de servicio:

  • Se define una instancia de servicio, denominada svc:/site/application/database/oracle:default. Esta instancia se encuentra activada de manera predeterminada.

    En este ejemplo se muestran dos maneras de definir la instancia predeterminada. En este ejemplo, la instancia predeterminada está definida en el elemento create_default_instance en la parte superior del manifiesto. El elemento instance en la parte inferior del manifiesto muestra la otra manera de hacerlo.

  • Este servicio requiere que se monten todos los sistemas de archivos locales y se inicialicen todas las interfaces de red.

    Si está utilizando una base de datos con copia de seguridad en archivo, el servicio de base de datos debe depender del sistema de archivos local. Si utiliza ASM, el servicio de base de datos debe depender del servicio que gestiona ASM. El servicio de base de datos debe depender de la red para permitir conexiones de clientes remotos.

  • El elemento method_environment en el elemento method_context define las variables de entorno ORACLE_HOME y ORACLE_SID, que identifican la instancia de base de datos a iniciar o detener. Estos valores están disponibles para la secuencia de comandos de método a utilizar.

    Si crea varias instancias de este servicio (consulte el elemento instance en la parte inferior del manifiesto), entonces, es posible que cada instancia necesite su propio elemento method_context para definir los valores ORACLE_HOME y ORACLE_SID únicos para esa base de datos en particular.

  • Los atributos del elemento method_context pueden definir una agrupación de recursos además del proyecto y directorio de trabajo mostrados en este ejemplo. También puede definir un elemento method_profile o method_credential en el elemento method_context. El elemento method_credential puede especificar los valores supp_groups y limit_privileges además de los valores user, group y privileges mostrados en este ejemplo. Consulte la DTD para obtener más información.

  • La secuencia de comandos de método de inicio/detención es /lib/svc/method/oracle. Se incrementa el número de segundos predeterminado antes de que se agote el tiempo de espera.

  • Un usuario debe tener asignada la autorización solaris.smf.manage.oracle para activar o desactivar esta instancia de servicio. En este ejemplo, el usuario oracle tiene asignada la autorización 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>

Agregue un nombre y metadatos de descripción al manifiesto de modo que los usuarios puedan obtener información sobre este servicio a partir de los comandos svcs y svccfg describe. Consulte el elemento template en la DTD.

Utilice el comando svccfg validate para asegurarse de que el manifiesto de servicio sea válido.

La siguiente secuencia de comandos de método de inicio/detención es /lib/svc/method/oracle, para el servicio de control de instancia de Oracle Database. Este método llama a los comandos dbstart y dbshut de la base de datos.

#!/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

Servicio de listener de base de datos

El listener es un proceso que gestiona el tráfico entrante de las solicitudes de conexión cliente a la instancia de base de datos. El servicio de listener depende de la instancia de servicio de base de datos cuyas conexiones cliente está gestionando.

Esta sección muestra el manifiesto de servicio de listener de instancia de Oracle Database, /lib/svc/manifest/site/listener.xml. Las siguientes son algunas funciones a tener en cuenta acerca de este manifiesto de servicio:

  • Se define una instancia de servicio, denominada svc:/site/application/database/listener:default. Esta instancia se encuentra activada de manera predeterminada.

  • Este servicio requiere que se inicie el servicio de control de instancia de Oracle Database, svc:/site/application/database/oracle. Si la instancia de base de datos se reinicia por cualquier motivo, el listener también se reiniciará.

  • El elemento method_environment en el elemento method_context define las variables de entorno ORACLE_HOME y ORACLE_SID, que identifican la instancia de base de datos a iniciar o detener. Estos valores están disponibles para la secuencia de comandos de método a utilizar.

    Si crea varias instancias de este servicio (consulte el elemento instance en la parte inferior del manifiesto), entonces, es posible que cada instancia necesite su propio elemento method_context para definir los valores ORACLE_HOME y ORACLE_SID únicos para esa base de datos en particular.

  • Los atributos del elemento method_context pueden definir una agrupación de recursos además del proyecto y directorio de trabajo mostrados en este ejemplo. También puede definir un elemento method_profile o method_credential en el elemento method_context. El elemento method_credential puede especificar los valores supp_groups y limit_privileges además de los valores user, group y privileges mostrados en este ejemplo. Consulte la DTD para obtener más información.

  • La secuencia de comandos de método de inicio/detención es /lib/svc/method/listener. Se incrementa el número de segundos predeterminado antes de que se agote el tiempo de espera.

  • Un usuario debe tener asignada la autorización solaris.smf.manage.oracle para activar o desactivar esta instancia de servicio.

  • El servicio es transient. Consulte Modelos de servicio.

<?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>

Agregue un nombre y metadatos de descripción al manifiesto de modo que los usuarios puedan obtener información sobre este servicio a partir de los comandos svcs y svccfg describe. Consulte el elemento template en la DTD.

La siguiente secuencia de comandos de método de inicio/detención es /lib/svc/method/listener, para el servicio de listener de instancia de Oracle Database. Este método inicia o detiene un proceso del listener, lsnrctl. Cuando lsnrctl se inicia, comprueba el estado del servicio de base de datos.

#!/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