基于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