基於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
四、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。
oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html