本示例介绍了用于帮助管理 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