Services in Oracle Database 10g
阿新 • • 發佈:2019-02-11
基於RAC環境中使用的應用程式,有時候希望某個特定的應用程式僅僅執行在RAC的子節點,或者說為某些應用程式分配一個首要節點。對此,Oracle 10g可以使用services來實現。
一、叢集配置
在使用services之前,需要首先檢查叢集的配置是否正確。 下面的命令輸出了資料庫ORCL運行於三個不同的節點。 srvctl config database -d ORCL server01 ORCL1 /u01/app/oracle/product/10.1.0/db_1 server02 ORCL2 /u01/app/oracle/product/10.1.0/db_1 server03 ORCL3 /u01/app/oracle/product/10.1.0/db_1 這些配置通常在資料庫建立期間完成。也可以通過下面的命令來完成。 srvctl add database -d ORCL -o /u01/app/oracle/product/10.1.0/db_1 #新增資料庫ORCL的$ORACLE_HOME到crs srvctl add instance -d ORCL -i ORCL1 -n server01 #為資料庫ORCL新增相應的instance到crs srvctl add instance -d ORCL -i ORCL2 -n server02 srvctl add instance -d ORCL -i ORCL3 -n server03
二、建立service
可以使用srvctl命令,dbca工具以及DBMS_SERVICES包來建立以及修改service。本文僅僅使用srvctl命令列來完成。 假定有兩個應用程式希望以以下方式執行: OLTP :主要執行在節點1和節點2,當節點1和2不可用時,則能夠執行在節點3。 BATCH :主要執行在節點3,當節點3不可用時,則能夠執行在節點1和2。 為滿足上面的需求,我們可以建立以下services # Set environment. export ORACLE_HOME=/u01/app/oracle/product/10.1.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH # Create services. srvctl add service -d ORCL -s OLTP_SERVICE -r ORCL1,ORCL2 -a ORCL3 srvctl add service -d ORCL -s BATCH_SERVICE -r ORCL3 -a ORCL1,ORCL2 OLTP_SERVICE 能夠執行在所有的RAC節點,因為ORCL3位於可用列表中,但通常情況下則主要執行在節點1和節點2。(-r 表明為可用節點) BATCH_SERVICE 能夠執行在所有的RAC節點,因為ORCL1與ORCL2位於可用列表中,通常情況下該service執行在節點3。(-r 表明為可用節點) 這些services能夠通過以下命令來啟動後停止 srvctl start service -d ORCL -s OLTP_SERVICE srvctl start service -d ORCL -s BATCH_SERVICE srvctl stop service -d ORCL -s OLTP_SERVICE srvctl stop service -d ORCL -s BATCH_SERVICE
三、Jobs and Services
--Oracle 10g scheduler允許job和job 類連結,從而使得與services相關的job按job 類執行在RAC環境的指定節點。 --為滿足上述的需求,對此可以建立以下兩個job類。 -- Create OLTP and BATCH job classes. BEGIN DBMS_SCHEDULER.create_job_class( job_class_name => 'OLTP_JOB_CLASS', service => 'OLTP_SERVICE'); DBMS_SCHEDULER.create_job_class( job_class_name => 'BATCH_JOB_CLASS', service => 'BATCH_SERVICE'); END; / -- Make sure the relevant users have access to the job classes. GRANT EXECUTE ON sys.oltp_job_class TO my_user; GRANT EXECUTE ON sys.batch_job_class TO my_user; --可以為存在的job指派到新建立的job類或在建立job時指派到這個job 類 -- Create a job associated with a job class. BEGIN DBMS_SCHEDULER.create_job ( job_name => 'my_user.oltp_job_test', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN NULL; END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY;', job_class => 'SYS.OLTP_JOB_CLASS', end_date => NULL, enabled => TRUE, comments => 'Job linked to the OLTP_JOB_CLASS.'); END; / --對於上面的這個job與job類的理解是,service可以執行在一個或多個指定的節點以及可用節點,因此可以基於service來建立Job。 --接下來為這個Job指派到基於service的job類,從而使得這個job也可以執行在指定的一個或多個節點。 -- Assign a job class to an existing job. EXEC DBMS_SCHEDULER.set_attribute('MY_BATCH_JOB', 'JOB_CLASS', 'BATCH_JOB_CLASS'); --Translator: Robinson --Blog: http://blog.csdn.net/robinson_0612
四、Connections and Services
services的使用不會由於使用了job而受到限制。下面的services能夠新增到tnsnames.ora檔案,且列出每一個應用程式可以使用哪一個節點。
OLTP =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = server01)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server02)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server03)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = OLTP_SERVICE)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 20)
(DELAY = 1)
)
)
)
BATCH =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = server01)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server02)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = server03)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = BATCH_SERVICE)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 20)
(DELAY = 1)
)
)
)
#上面為應用程式提供了相應的連結識別符號,通過相應的連線識別符號將連線到指定的service。
五、更多參考
有關基於使用者管理的備份和備份恢復的概念請參考
有關RMAN的備份恢復與管理請參考
有關ORACLE體系結構請參考