1. 程式人生 > >Services in Oracle Database 10g

Services in Oracle Database 10g

        基於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體系結構請參