Go to main content
Oracle® Solaris 11.3 でのシステムサービスの開発

印刷ビューの終了

更新: 2016 年 11 月
 
 

Oracle データベースリスナーサービスの作成

このセクションでは、Oracle データベースリスナーサービスマニフェストと、そのマニフェストで使用される起動/停止メソッドスクリプトについて説明します。

リスナーとは、データベースインスタンスへのクライアント接続要求の着信トラフィックを管理するプロセスです。データベースサービスはリスナーサービスインスタンスに依存するため、データベースサービスが起動する前に、これらのデータベースサービスの依存関係をオンラインにするようにしてください。

リスナーサービスマニフェスト

次に、Oracle データベースリスナーサービスマニフェスト /lib/svc/manifest/site/listener.xml について留意すべきいくつかの特徴を示します。

  • svc:/site/application/database/listener:default の名前の 1 つのサービスインスタンスが定義されます。このインスタンスはデフォルトで有効になっています。マニフェストのいちばん上にある create_default_instance 要素を参照してください。

  • Oracle データベースインスタンス制御サービス svc:/site/application/database/oracle は、このリスナーサービスに依存します。ただし、リスナーサービスの起動が失敗しても、データベースサービスは引き続き起動されます。インスタンス制御サービスマニフェストにある optional_all 依存関係を参照してください。

  • method_context 要素内の method_environment 要素は、ORACLE_HOME および ORACLE_SID 環境変数を定義し、この環境変数は起動または停止するデータベースインスタンスを識別します。これらの値はその後、使用するメソッドスクリプトで使用できます。

    このサービスの複数のインスタンスを作成した場合、その特定のデータベースに対して一意の ORACLE_HOME および ORACLE_SID 値を定義するには、各インスタンスに独自の method_context 要素が必要になる可能性があります。

  • method_context 要素の属性は、この例に示すプロジェクトおよび作業ディレクトリに加え、リソースプールを定義できます。method_context 要素では method_profile または method_credential のどちらかの要素も定義できます。method_credential 要素では、この例で示す usergroup、および privileges の値に加え、supp_groups および limit_privileges の値を指定できます。詳細は DTD を参照してください。

  • 起動/停止メソッドスクリプトは /lib/svc/method/listener です。メソッドがタイムアウトするまでの秒数は、デフォルトから増えています。

  • ユーザーには、このサービスインスタンスを有効または無効にするための solaris.smf.manage.oracle 承認が割り当てられている必要があります。

  • サービスは transient です。Oracle Solaris 11.3 でのシステムサービスの管理 の サービスモデルを参照してください。

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

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

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

名前および説明メタデータをマニフェストに追加して、ユーザーがこのサービスに関する情報を svcs コマンドおよび svccfg describe コマンドから得られるようにします。DTD 内の template 要素を参照してください。

リスナーサービスの起動/停止メソッドスクリプト

次に、Oracle データベースインスタンスリスナーサービス用の起動/停止メソッドスクリプト /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
                        smf_method_exit $SMF_EXIT_ERR_FATAL
                fi

                sleep 1
        done

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

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

function shutdown
{
        lsnrctl stop
}

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

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

smf_method_exit $SMF_EXIT_OK