基于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。
原文链接: Services in Oracle Database 10g
五、更多参考
有关Oracle 网络配置相关基础以及概念性的问题请参考:
配置ORACLE 客户端连接到数据库
配置非默认端口的动态服务注册
配置sqlnet.ora限制IP访问Oracle Oracle 监听器日志配置与管理
设置 Oracle 监听器密码(LISTENER) Oracle RAC 监听配置 ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
Oracle RAC 客户端连接负载均衡(Load Balance)
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 基于备份控制文件的恢复(unsing backup controlfile)
有关RMAN的备份恢复与管理请参考
有关ORACLE体系结构请参考
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 实例和Oracle数据库(Oracle体系结构)
时间: 2024-10-21 15:38:50