本示例介绍了用于帮助管理 Oracle 数据库的以下服务:
用于启动或停止 Oracle 数据库实例的数据库服务
用于启动侦听器的侦听器服务,这是管理数据库实例的客户机连接请求传入通信的进程。
此示例使用由文件提供支持的存储。除了使用由文件提供支持的存储以外,还可以使用自动存储管理 (Automatic Storage Management, ASM) 功能。ASM 是一个卷管理器,也是一个适用于 Oracle 数据库文件的文件系统。
每次安装 Oracle 数据库时,都必须设置以下环境变量:
安装数据库的位置。在本节的示例中,数据库的安装位置为 /opt/oracle/product/home。
系统中唯一标识特定数据库的系统 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_HOME 和 ORACLE_SID 环境变量,用于标识要启用或停止的数据库实例。然后这些值可用于要使用的方法脚本。
如果您创建此服务的多个实例(请参见清单底部的 instance 元素),则每个实例可能都需要有自己的 method_context 元素,以便为该特定数据库定义唯一的 ORACLE_HOME 和 ORACLE_SID 值。
除了此示例中所示的项目和工作目录之外,method_context 元素的属性还可以定义资源池。您还可以在 method_context 元素中定义 method_profile 或 method_credential 元素。除了此示例中所示的 user、group 和 privileges 值之外,method_credential 元素还可以指定 supp_groups 和 limit_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>
将名称和说明元数据添加到清单中,以便用户可以通过 svcs 和 svccfg describe 命令获得有关此服务的信息。请参见 DTD 中的 template 元素。
使用 svccfg validate 命令确保服务清单有效。
下面是 Oracle 数据库实例控制服务的 start/stop 方法脚本 /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 的服务实例。缺省情况下,此实例处于启用状态。
此服务需要 Oracle 数据库实例控制服务 svc:/site/application/database/oracle 才能启动。如果数据库实例由于某种原因而重新启动,则侦听器也将重新启动。
method_context 元素中的 method_environment 元素定义 ORACLE_HOME 和 ORACLE_SID 环境变量,用于标识要启用或停止的数据库实例。然后这些值可用于要使用的方法脚本。
如果您创建此服务的多个实例(请参见清单底部的 instance 元素),则每个实例可能都需要有自己的 method_context 元素,以便为该特定数据库定义唯一的 ORACLE_HOME 和 ORACLE_SID 值。
除了此示例中所示的项目和工作目录之外,method_context 元素的属性还可以定义资源池。您还可以在 method_context 元素中定义 method_profile 或 method_credential 元素。除了此示例中所示的 user、group 和 privileges 值之外,method_credential 元素还可以指定 supp_groups 和 limit_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>
将名称和说明元数据添加到清单中,以便用户可以通过 svcs 和 svccfg 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