この例は、Oracle データベースの管理に役立つ次のサービスを示します。
Oracle データベースインスタンスを起動または停止するデータベースサービス
データベースインスタンスへのクライアント接続要求の着信トラフィックを管理するプロセスであるリスナーを開始するリスナーサービス
この例ではファイルベースストレージを使用します。ファイルベースストレージを使用する代わりに、自動ストレージ管理 (ASM) 機能を使用できます。ASM はボリュームマネージャーであり、Oracle データベースファイル用のファイルシステムです。
次の環境変数は、Oracle データベースのインストールごとに設定する必要があります。
データベースがインストールされている場所。このセクションの例では、データベースインストールの場所は /opt/oracle/product/home です。
システム上の特定のデータベースを一意に識別するためのシステム ID。
この例では、これらの環境変数はサービスマニフェストで設定されており、メソッドスクリプトで使用されます。
このセクションでは、Oracle データベースインスタンス制御サービスマニフェスト /lib/svc/manifest/site/oracle.xml を示します。次に、このサービスマニフェストに関するいくつかの注意点を示します。
svc:/site/application/database/oracle:default の名前の 1 つのサービスインスタンスが定義されます。このインスタンスはデフォルトで有効になっています。
この例では、デフォルトインスタンスを定義する 2 つの方法を示します。この例では、デフォルトインスタンスがマニフェストの先頭にある create_default_instance 要素に定義されています。マニフェストの末尾にある instance 要素は、これを行う別の方法を示しています。
このサービスでは、すべてのローカルファイルシステムがマウントされ、すべてのネットワークインタフェースが初期化されていることが必要です。
ファイルベースデータベースを使用している場合、データベースサービスはローカルファイルシステムに依存している必要があります。ASM を使用している場合、データベースサービスは、ASM を管理するサービスに依存している必要があります。データベースサービスは、リモートクライアント接続を可能にするためにネットワークに依存している必要があります。
method_context 要素内の method_environment 要素は、ORACLE_HOME および ORACLE_SID 環境変数を定義し、この環境変数は起動または停止するデータベースインスタンスを識別します。これらの値はその後、使用するメソッドスクリプトで使用できます。
このサービスの複数のインスタンスを作成した場合 (マニフェストの末尾にある instance 要素を参照)、それぞれのインスタンスは、その特定のデータベースに対し一意の ORACLE_HOME および ORACLE_SID 値を定義するために、独自の method_context 要素を必要とすることがあります。
method_context 要素の属性は、この例に示すプロジェクトおよび作業ディレクトリに加え、リソースプールを定義できます。method_context 要素では method_profile または method_credential のどちらかの要素も定義できます。method_credential 要素では、この例で示す user、group、および privileges の値に加え、supp_groups および limit_privileges の値を指定できます。詳細は DTD を参照してください。
起動/停止メソッドスクリプトは /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>
名前および説明メタデータをマニフェストに追加して、ユーザーがこのサービスに関する情報を svcs コマンドおよび svccfg describe コマンドから得られるようにします。DTD 内の template 要素を参照してください。
svccfg validate コマンドを使用して、サービスマニフェストが有効であることを確認します。
次に、Oracle データベースインスタンス制御サービス用の起動/停止メソッドスクリプト /lib/svc/method/oracle を示します。このメソッドは、データベースの dbstart コマンドおよび dbshut コマンドを呼び出します。
#!/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 の名前の 1 つのサービスインスタンスが定義されます。このインスタンスはデフォルトで有効になっています。
このサービスでは、Oracle データベースインスタンス制御サービス svc:/site/application/database/oracle を起動している必要があります。データベースインスタンスが何らかの理由で再起動した場合、リスナーも再起動します。
method_context 要素内の method_environment 要素は、ORACLE_HOME および ORACLE_SID 環境変数を定義し、この環境変数は起動または停止するデータベースインスタンスを識別します。これらの値はその後、使用するメソッドスクリプトで使用できます。
このサービスの複数のインスタンスを作成した場合 (マニフェストの末尾にある instance 要素を参照)、それぞれのインスタンスは、その特定のデータベースに対し一意の ORACLE_HOME および ORACLE_SID 値を定義するために、独自の method_context 要素を必要とすることがあります。
method_context 要素の属性は、この例に示すプロジェクトおよび作業ディレクトリに加え、リソースプールを定義できます。method_context 要素では method_profile または method_credential のどちらかの要素も定義できます。method_credential 要素では、この例で示す user、group、および privileges の値に加え、supp_groups および limit_privileges の値を指定できます。詳細は DTD を参照してください。
起動/停止メソッドスクリプトは /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>
名前および説明メタデータをマニフェストに追加して、ユーザーがこのサービスに関する情報を 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
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