이 예에서는 Oracle 데이터베이스를 관리하는 데 도움이 되는 다음 서비스를 제공합니다.
Oracle 데이터베이스 인스턴스를 시작하거나 중지하는 데이터베이스 서비스
데이터베이스 인스턴스에 대한 클라이언트 연결 요청의 수신 트래픽을 관리하는 프로세스인 리스너를 시작하는 리스너 서비스
이 예에서는 파일 지원 저장소를 사용합니다. 파일 지원 저장소 대신 ASM(Automatic Storage Management) 기능을 사용할 수 있습니다. 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 요소 참조) 각 인스턴스에는 해당 특정 데이터베이스에 대한 고유한 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라는 하나의 서비스 인스턴스가 정의됩니다. 이 인스턴스는 기본적으로 사용으로 설정됩니다.
서비스를 사용하려면 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