zoukankan      html  css  js  c++  java
  • oracle HA 高可用性具体解释(之中的一个)

    oracle HA 高可用性具体解释(之二,深入解析TAF,以及HA框架) :http://blog.csdn.net/panfelix/article/details/38436197


    一、HA

    FAILOVER,Oracle RAC的高可用性的技术基础是Failover,就是指集群中的热河一个节点的故障都不会影响到用户的使用,连接到故障节点的用户会被自己主动转移到健康节点,从用户高手而言感觉不到这样的切换,这个功能在Oracle中被称作Failover(故障转移)。

    Oracle RAC的Failover能够细分为3中,各自是:

    (1)  Client-Side Connect time Failover;

    (2)  TAF;

    (3)  Server-side TAF;

    注意:

    不要再listener.ora中设置GLOBAL_DB_NAME,由于这个參数会禁用Connect-time Failover和TransparentApplication Failover。

     

    Client-Side Connect time Failover

    Client-Side Connect timeFailover的含义是:假设clienttnsname中配置了多个地址,用户发起请求时,会先尝试连接地址表中的第一个地址,假设这个连接尝试失败,则会继续尝试使用第二个地址,直至连接成功或者遍历了全部的地址。

    这样的Failover的特点从他的名称中“connect time”就表达的非常清楚了,仅仅在建立连接的那一时刻起作用。也就是说这样的Failover方式仅仅在发起连接时採取感知节点故障,假设发现节点没有响应,则自己主动尝试地址列表的下一个地址。一旦连接建立以后,节点出现问题都不会做处理,从client的表现来看就是断开,用户程序必须又一次建立连接。

    启用这样的Failover的方法就是在client的tnsnames.ora中加入FAILOVER=ON条目,这个參数默认就是ON,所以即使不加入这个条目,client也会获得这样的Failover能力。

     

    TAF(Transparent Apllication Failover)

    从上文对Client-Side Connecttime Failover特点的分析能够看出,这样的failover的意义有限。下载大部分流行的应用系统(比方WebLogic,JBOSS)都是启动时就建立若干到数据库的长连接,在应用程序整个生命周期内重用这些连接。Client-Side Connect Time Failover的工作方式是它相应用程序的可用性没有极大地帮助。

    从8.1.5版本号Oracle引入了新的Failover机制TAF.所谓TAF,就是连接建立以后,应用程序执行过程中,假设某个实例发生问题,连接到这个实例上的用户会被自己主动迁移到其它的健康实例上。对于应用程序而言,这个千亿过程透明、不须要用户的介入,当然这样的透明也是有引號的,由于用户的未提交事务会回滚。相对于Client-Side Connect Time Failover的用户程序被中断、抛出连接错误、用户必须中期应用程序,TAF这样的方式在提高应用程序HA能力上无疑是前进了一大步。

    TAF的配置也非常easy,仅仅须要在client的tnsnames.ora中加入FAILOVER_MODE配置项,这个条目有4个子项目须要定义。

     

     

    FRAC =

     (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = frac1-vip)(PORT = 1521))

        (ADDRESS = (PROTOCOL = TCP)(HOST = frac2-vip)(PORT = 1521))

         (LOAD_BALANCE=YES)

          (

     CONNECT_DATA=

        (SERVER=DEDICATED)

     (SERVICE_NAME=FRAC)

     (

       FAILOVER_MODE=

    (TYPE=session)

    (METHOD=basic)

    (RETRIES=180)

    (DELAY=5)

     )

          )

        )

     

    (1)  METHOD选项用于定义何时创建到其它实例的连接,有BASIC和PERCONNECT两个选项值。

    a. BASIC是指在感知到节点故障时才创建到其它实例的连接。

    b. PERCONNECT是在最初建立连接时就同一时候建立到全部实例的连接,当发生问题时,立马就能够切换到其它链路上。

    两种方法的不同非常easy比較。BASIC方式在Faiover时会有时间言辞,PERCONNECT方式尽管没有时间言辞,可是再建立多个冗余两节会消耗很多其它的资源,两者就是用时间换资源和资源换时间的差别。

     

    (2)  Type选项用于定于发生问题时对完毕的SQL语句怎样处理,其有两种类型:session和select。

    这两种方式对于未提交的事务都自己主动回滚。差别在于对于select语句的处理,对于select类型,用户正在运行的select语句也会被转移到新的实力上,在新节点上继续返回兴许结果集,而已经返回的记录结果集抛弃。

    假设用户正在节点1上运行查询,整个结果集共同拥有100条记录,如今一从节点1上返回10条记录,这时节点1宕机,用户连接被转移到节点2上,假设是session方式则须要又一次运行查询语句;假设是select方式会从节点2上继续返回剩下的90条记录,二已经从节点1返回的10条记录不会反复返回给用户,对于用户而言感觉不到这样的切换。

    非常显然为了实现select方式,oracle必须为每一个session保存很多其它的内容,包含游标、用户、上下文等,须要很多其它的资源也是用资源换时间的方案。

    (3)  DELAY和RETRIES这两个參数和简单,代表着重试时间间隔和重试次数。

     

     

    Failover(TAF)的測试借助于前面监听和tnsnames的配置,而在11G R2没有引入之前出现问题用的是直接用集群的vip“漂”进行故障转移,而在11G R2以后,引入了一个新的ip,即SCAN(SingleClient Access Name)IP,Scan是一个域名,能够解析1到3个scan ip,client能够通过SCAN名解析来訪问数据库,其优点就是加入和删除节点时不须要再有额外的client维护,大大降低了维护方面的繁琐工作。

    在集群环境中,我们配置的client是以scan ip的方式进行配置的。当我们某个用户在外面连接进来的时候,集群会自己主动的依据负载把该会话连接到一个特定的实例,假设该会话正在select一个表,还未完毕,该实例宕机了,oracle会自己主动将故障节点的失误切换到还有一个实例中运行,这种切换对于用户来说是透明的。用户不会感觉到异常,所运行操作也将返回正常的结果,这个也是RAC集群的高可用性所在。

    下面是在session模式做的网络failover測试;

    首先用户用client服务进行连接:

    [oracle@frac1admin]$ sqlplus scott/oracle@frac

    SQL*Plus: Release11.2.0.3.0 Production on Wed Apr 16 01:55:37 2014

    Copyright (c) 1982,2011, Oracle.  All rights reserved.

    Connected to:

    Oracle Database 11gEnterprise Edition Release 11.2.0.3.0 - 64bit Production

    With thePartitioning, Real Application Clusters, Automatic Storage Management, OLAP,

    Data Mining and RealApplication Testing options

    SQL> showparameter instance_name

    NAME                                 TYPE                   VALUE

    ---------------------------------------------------------- ------------------------------

    instance_name                        string                 FRAC2

     

     

    SQL> create tablebig_a as select * from dba_objects;

     

    SQL>insert intobig_a select * from big_a;

     

    为了保证数据的充足性,多运行几次上面insert语句,因为磁盘空间限制,我在此运行了4次,共1203888条记录。

    由以上信息可知用户连接到frac2实例,此时能够运行一些DML操作:

    SQL> selectOBJECT_TYPE,count(*) from big_a group by object_type;

    在查询未完毕之前,把frac2实例进行宕机,会返回例如以下错误:

    SQL> shutdownabort;

    ORACLE instance shutdown.

     

     

    SQL> selectOBJECT_TYPE,count(*) from dba_objects group by object_type;

    selectOBJECT_TYPE,count(*) from dba_objects group by object_type

    *

    ERROR at line 1:

    ORA-25408: can notsafely replay call

    再次查看的是时候发现已经把会话自己主动切换到frac1实例:

    SQL> /

    OBJECT_TYPE                              COUNT(*)

    ------------------------------------------------

    EDITION                                         1

    INDEX PARTITION                               302

    TABLESUBPARTITION                             32

    CONSUMER GROUP                                 25

    SEQUENCE                                      229

    TABLE                                        2936

    INDEX                                        5266

    SYNONYM                                     28152

    VIEW                                         5186

    FUNCTION                                      305

    JAVA CLASS                                  23165

    JAVA SOURCE                                     2

    INDEXTYPE                                       9

    CLUSTER                                        10

    TYPE                                         2913

    RESOURCE PLAN                                  10

    JOB                                            14

    EVALUATIONCONTEXT                             15

    45 rows selected.

     

    SQL> showparameter instance_name;

    NAME                                 TYPE                                     VALUE

    ---------------------------------------------------------------------------- ------

    instance_name                        string                                   FRAC1

    SQL> !hostname

    frac1

    Server-Side TAF

    第三种方式是Server-Side TAF,但从名字上就能够猜出这样的方式和之前的TAF有一定的关系。其实也是这样,能够把Server-Side TAF看做是TAF的一个变种。首先Server-Side TAF也是TAF,全部TAF的特点他都具有;其次,这样的TAF是在server上配置,而不像TAF是在client配置的。

    前面介绍的Client-Side TAF,配置过程须要改动clienttnsnames.ora文件,假设有非常多client使用这个数据库,那么每次微小的參数调整都要把书友计算机更改一遍,即低效又易出错。而Server-Side TAF通过结合Service,在数据库里保存FAIL_MODE的配置,把全部的TAF配置保存在数据字典里,从而省去了client的配置工作,如今client的TNS文件就不须要不论什么TAF的配置选项。

    从配置參数而言,Service-Side TAF相比多了一个Instance Role(实力角色)的概念。所谓实力角色,就是当有多个Instance參与一个Service时,能够配置有限使用哪一个Instance为用户提供服务。用户总共同拥有两种可选角色。

    a.    PREFERRED:首选实例,会优先选择拥有这个角色的实例提供服务。

    b.    AVILABLE:后备实例,用户会优先连接PREFERRD的Instance,当PREFERRED的Instance不可用时,才会被转移到AVILABLE的实例上。

     

    要想使用Server-Side TAF必须配置Server。Server能够在创建数据库时创建,也能够在数据库创建之后改动;既能够通过配置向导也能够通过命令行方式配置。以下分别演示用DBCA和手工两种方式配置Service的过程。




    1.用DBCA配置Service

     



     




     

    实例1作为首选实例,TAF police选择basic,參考上图;



     

     

    查看配置信息:

    [root@felix1bin]# ./srvctl config service -d felix -h

    Usage:srvctl config service -d <name> [-s <service_name>] [-a] [-S<level>]

        -d <name>           Unique name for the database

        -s <service>        Service name

        -a                  Additional attributes

        -S <level>          Additional information for EM Console

        -h                  Print usage

     

     [root@felix1bin]# ./srvctl config service -d felix

    taf_server PREF: felix1 AVAIL: felix2

    [root@felix1 bin]#

     

    [root@felix1 bin]# ./srvctl config service -dfelix -s taf_server -a

    taf_server PREF: felix1 AVAIL: felix2 TAF:basic

    [root@felix1 bin]#

     

     

     

    2.用srvctl命令配置service

     

    除了用DBCA图形方式,还能够使用命令方式配置service,这样的方法对于维护远程尤事实上用。不管是创建还是维护都是用一个命令srvctl,先看一下srvctl命令和service相关的语法,例如以下:

    创建service

    [oracle@felix1 ~]$ srvctl add service -h

    Usage: srvctl add service -d <name> -s<service_name> -r "<preferred_list>" [-a"<available_list>"] [-P <TAF_policy>]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -r"<pref_list>"    List ofpreferred instances

        -a"<avail_list>"   List ofavailable instances

        -P<TAF_policy>     TAF policy (NONE,BASIC, or PRECONNECT)

    Usage: srvctl add service -d <name> -s<service_name> -u {-r "<new_pref_inst>" | -a"<new_avail_inst>"}

        -d<name>           Unique name forthe database

        -s <service>        Service name

        -u                  Add a new instance to serviceconfiguration

        -r<new_pref_inst>  Name of newpreferred instance

        -a<new_avail_inst> Name of new available instance

        -h                  Print usage

    [oracle@felix1 ~]$

    示比例如以下:

    Felix1,felix2为实例名;Felix是数据库名;策略是:BASIC

    [oracle@felix1~]$ srvctl add service -d felix -s taf_srvctl -r felix2 -a felix1 -P BASIC

    [oracle@felix1~]$

     

    查看service配置

    [oracle@felix1 ~]$ srvctl config service -d felix-a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl config service -d felix-h

    Usage: srvctl config service -d <name> [-s<service_name>] [-a] [-S <level>]

        -d<name>           Unique name for the database

        -s<service>        Service name

        -a                  Additional attributes

        -S<level>          Additionalinformation for EM Console

        -h                  Print usage

    [oracle@felix1 ~]$

    假设不指定“-s service_name”,就会显示全部的service配置,这些配置仅仅包含preferred和avilable instance。使用-a选项,还会显示TAF的信息。

     

    是否自己主动执行

    数据库启动时,会自己主动启动全部的service。有时为了维护的须要,须要禁用这个特性。在维护完毕之后再启动这个特性。

     

    [oracle@felix1 ~]$ srvctl disable service -h

    Usage: srvctl disable service -d <name> -s"<service_name_list>" [-i <inst_name>]

        -d<name>           Unique name forthe database

        -s"<serv,...>"     Commaseparated service names

        -i<inst>           Instance name

        -h                  Print usage

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server -i felix1

    [oracle@felix1 ~]$ srvctl config service -d felix-a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    Service taf_server is disabled on instance(s) felix1.

    taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server

    PRKP-1024 : The service taf_server is stillrunning.

     

    关闭服务service并diable:

     

    [oracle@felix1 ~]$ srvctl stop service -h

    Usage: srvctl stop service -d <name> [-s"<service_name_list>" [-i <inst_name>]] [-f]

        -d<name>           Unique name forthe database

        -s"<serv,...>"     Commaseparated service names

        -i<inst>           Instance name

        -f                  Disconnect all sessionsduring stop or relocate service operations

        -h                  Print usage

    [oracle@felix1 ~]$ srvctl stop service  -d felix -staf_server

    [oracle@felix1 ~]$ srvctl config service -d felix-a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

    [oracle@felix1 ~]$ srvctl disable service -d felix-s taf_server

    [oracle@felix1 ~]$ srvctl config service -d felix-a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    Service taf_server is disabled.

    taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

    [oracle@felix1 ~]$

    启动service

    [oracle@felix1 ~]$ srvctl start service  -h

    Usage: srvctl start service -d <name> [-s"<service_name_list>" [-i <inst_name>]] [-o<start_options>]

        -d<name>           Unique name forthe database

        -s"<serv,...>"     Commaseparated service names

        -i<inst>           Instance name

        -o<start_options>  Options to startupcommand (e.g. open, mount, or nomount)

        -h                  Print usage

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl start service  -d felix -s taf_server

    [oracle@felix1 ~]$

     

    查看service状态。

    [oracle@felix1 ~]$ srvctl status  service -h

    Usage: srvctl status service -d <name> [-s"<service_name_list>"] [-f] [-v] [-S <level>]

        -d<name>           Unique name forthe database

        -s"<serv,...>"     Comma separatedservice names

        -f                  Include disabled applications

        -v                  Verbose output

        -S<level>          Additionalinformation for EM Console

        -h                  Print usage

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl status  service -d felix -s taf_server -f -v

    Service taf_server is running on instance(s)felix2

    [oracle@felix1 ~]$ srvctl status  service -d felix -s taf_server -f -v -S 3

    #@=info: operation={status} config={full}ver={10.2.0.0.0}

    #@=service[0]: name={taf_server} enabled={true}pref={felix1} avail={felix2} disabled_insts={felix1} tafpolicy={basic}type={user}

    #@=service[1]: name={felix} enabled={true}pref={felix1, felix2} avail={} disabled_insts={} tafpolicy={NONE}type={internal}

    Service taf_server is running on instance(s)felix2

    #@=result[0]: up={felix2} down={felix1}disabled={felix1} unknown={}

    #@=result[1]: up={felix1, felix2} down={}disabled={} unknown={}

    #@=done: status={0}

    [oracle@felix1 ~]$

     

    删除service。

    [oracle@felix1 ~]$ srvctl remove service -h

    Usage: srvctl remove service -d <name> -s<service_name> [-i <inst_name>] [-f]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -i<inst>           Instance name

        -f                  Force remove

        -h                  Print usage

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl status service -d felix

    Service taf_server is running oninstance(s) felix1

    Service taf_srvctl is not running.

    [oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server -i felix1

    taf_server PREF: felix1 AVAIL: felix2

    Remove service taf_server from the instancefelix1? (y/[n]) y

    PRKP-1024 : The service taf_server is still running.

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl remove service -d felix-s taf_srvctl -i felix1

    taf_srvctl PREF: felix2 AVAIL: felix1

    Remove service taf_srvctl from the instancefelix1? (y/[n]) y

    PRKP-1067 : Instance felix1 is the last availableinstance for service taf_srvctl. Try modify service instead.

    [oracle@felix1 ~]$ srvctl config  service -d felix -a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    taf_srvctl PREF: felix2 AVAIL: felix1 TAF: BASIC

    [oracle@felix1 ~]$

     

    [oracle@felix1 ~]$ srvctl remove service -d felix -staf_srvctl  -f

    [oracle@felix1 ~]$ srvctl config  service -d felix -a

    taf_server PREF: felix1 AVAIL: felix2 TAF: basic

    [oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server  -f

    PRKP-1024: The service taf_server is still running.

    [oracle@felix1 ~]$ srvctl stop service -d felix -staf_server 

    [oracle@felix1 ~]$ srvctl remove service -d felix-s taf_server  -f

    [oracle@felix1 ~]$ srvctl config  service -d felix -a

    [oracle@felix1 ~]$

    改动服务

    [oracle@felix1 ~]$ srvctl modify service -h

    Usage: srvctl modify service -d <name> -s<service_name> -i <old_inst_name> -t <new_inst_name> [-f]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -i<old_inst>       Old instance name

        -t<new_inst>       New instance name

        -f                  Disconnect all sessionsduring stop or relocate service operations

    Usage: srvctl modify service -d <name> -s<service_name> -i <avail_inst_name> -r [-f]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -i<inst>           Instance name

        -r                  Upgrade instance to preferred

        -f                  Disconnect all sessionsduring stop or relocate service operations

    Usage: srvctl modify service -d <name> -s<service_name> -n -i <prefered_inst> [-a <available_list>][-f]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -n                  Modify service configuration

        -r"<pref_list>"    List ofpreferred instances

        -a"<avail_list>"   List ofavailable instances

        -f                  Disconnect all sessions during stopor relocate service operations

    Usage: srvctl modify service -d <name> -s<service_name> -P <TAF_policy> [-f]

        -d<name>           Unique name forthe database

        -s<service>        Service name

        -P<TAF_policy>     TAF policy (NONE,BASIC, or PRECONNECT)

        -f                  Disconnect all sessionsduring stop or relocate service operations

        -h                  Print usage

    [oracle@felix1 ~]$

     

    [oracle@felix2 ~]$ srvctl modify service -d felix-s taf_srvctl -n -i felix1,felix2 -f

    [oracle@felix2 ~]$ srvctl config  service -d felix  -a

    taf_srvctlPREF: felix1 felix2 AVAIL:  TAF: basic

    [oracle@felix2 ~]$

     

     

     

    3.Service创建演示样例:

     

    在使用srvctl创建service时,须要注意TAF策略选项必须通过dbms_service包来配置。以下样例演示了怎样创建一个服务felix_ora:

    1.创建之前查看系统现有的service:

    SQL> show parameter service

     

    NAME                                 TYPE        VALUE

    ------------------------------------ -----------------------------------------

    service_names                        string      felix

    SQL>

    2.使用srvctl创建felix_ora服务;

    [oracle@felix1 ~]$ srvctl add service -d felix -s felix_ora -r felix1 -a felix2 -P BASIC

    [oracle@felix1 ~]$ 

    [oracle@felix1 ~]$ srvctl config service -d felix-a

    felix_ora PREF: felix1 AVAIL: felix2 TAF: BASIC

    [oracle@felix1 ~]$ srvctl status  service -d felix

    Service felix_ora is not running.

    [oracle@felix1 ~]$

    3.确认服务创建成功,下面标红部分说明服务已经作为一项CRS Resource注冊到CRS中,可是眼下没有启动。

    [oracle@felix1 ~]$ crs_stat -t  -v

    Name          Type           R/RA   F/FT  Target    State     Host       

    ----------------------------------------------------------------------

    ora.felix.db  application    0/0    0/1   ONLINE    ONLINE    felix1     

    ora....x1.inst application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora....x2.inst application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora...._ora.cs application   0/0    0/1    OFFLINE  OFFLINE              

    ora....ix1.srv application   0/0    0/0    OFFLINE  OFFLINE               

    ora....SM1.asm application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora....X1.lsnr application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.gsd application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.ons application    0/3   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.vip application    0/0   0/0    ONLINE    ONLINE   felix1     

    ora....SM2.asm application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora....X2.lsnr application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.gsd application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.ons application    0/3   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.vip application    0/0   0/0    ONLINE    ONLINE   felix2     

    [oracle@felix1 ~]$

    4.配置服务自己主动启动

    [oracle@felix1 ~]$ srvctl enable service -d felix-s felix_ora

    PRKP-1018 : Service felix_ora already enabled.

    [oracle@felix1 ~]$

    5.启动这个服务

    [oracle@felix1 ~]$ srvctl start  service -d felix -s felix_ora

    [oracle@felix1 ~]$

    [oracle@felix1 ~]$ srvctl status  service -d felix -s felix_ora

    Service felix_ora is running on instance(s) felix1

    [oracle@felix1 ~]$

    6.确认服务状态;

    [oracle@felix2 ~]$ crs_stat  -t  -v

    Name          Type           R/RA   F/FT  Target    State     Host       

    ----------------------------------------------------------------------

    ora.felix.db  application    0/0    0/1   ONLINE    ONLINE    felix1     

    ora....x1.inst application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora....x2.inst application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora...._ora.cs application   0/0    0/1    ONLINE   ONLINE    felix1     

    ora....ix1.srv application   0/0    0/0    ONLINE   ONLINE    felix1     

    ora....SM1.asm application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora....X1.lsnr application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.gsd application    0/5   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.ons application    0/3   0/0    ONLINE    ONLINE   felix1     

    ora.felix1.vip application    0/0   0/0    ONLINE    ONLINE   felix1     

    ora....SM2.asm application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora....X2.lsnr application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.gsd application    0/5   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.ons application    0/3   0/0    ONLINE    ONLINE   felix2     

    ora.felix2.vip application    0/0   0/0    ONLINE    ONLINE   felix2     

    [oracle@felix2 ~]$

    说明已经所有启动了;

    新建的服务会自己主动加入到初始化參数文件里:

    SQL> show parameter service

     

    NAME                                 TYPE        VALUE

    ------------------------------------ -----------------------------------------

    service_names                        string      felix, felix_ora

    SQL>

    7.改动service的TAF配置,须要使用dbms_service.modify_service

    begin

     dbms_service.modify_service(service_name     =>'felix_ora',

                                 failover_method  =>dbms_service.failover_method_basic,

                                 failover_type    =>dbms_service.failover_type_select,

                                 failover_retries =>180,

                                 failover_delay   =>5);

    end;

    /

     

    PL/SQL procedure successfully completed.

    8.确认以生效

     

    Set lines 1000 pages 1000

    col name for a50

    col clb_goal for a15

    col FAILOVER_METHOD  for a15

    col failover_type for a20;

    SQL> selectname,failover_method,failover_type,clb_goal from dba_services;

     

    NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

    ----------------------------------------------------------------- -------------------- ---------------

    SYS$BACKGROUND                                                                         SHORT

    SYS$USERS                                                                              SHORT

    seeddataXDB                                                                            LONG

    seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

    felixXDB                                                                                LONG

    felix                                                                                  LONG

    taf_server                                                                             LONG

    taf_srvctl                                                                             LONG

    felix_ora                                         BASIC           SELECT               LONG

     

    9 rows selected.

     

    [oracle@felix1 ~]$ srvctl config  service -d felix -a

    felix_ora PREF: felix1 AVAIL: felix2 TAF: BASIC

    [oracle@felix1 ~]$

     

    4.配置service的注意事项

    不管是通过DBCA图形化工具还是srvctl手工方式创建service,有下面几点须要注意:

    1.       数据库的服务名是用service_name參数来指定的,一个数据库能够有多个服务名,可是service_name最长4KB,不要手工改动这个參数。

    2.       最多能够创建64个service,每一个数据库有两个隐含的service,因此留给用户的就仅仅有62个service。不能改动这两个隐含service的配置,而且也不能手动启动或者停止这两个服务,这两个隐含service各自是SYS$BACKUPGROUD和SYS$USERS。

    3.       当使用DBCA配置service时,DBCA会自己主动更新OCR,启动service,当删除service时,会停止service并更新OCR。

    4.       使用SRVCTL这个工具时,命令仅仅会更新OCR中的配置不会更细data dictionary和listener中信息;因此须要使用dbms_sercice包来更新datadictionary,手工更改listener配置文件这里推荐使用DBCA工具来配置更改SERVICE配置。

    5.       假设client想要通过sercice方式连接数据库,须要在TNS条目中使用service_name方式引用数据库,见以下样例中的粗体部分:

     

    TAF_SERVER =

     (DESCRIPTION =

        (ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

        (ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

       (LOAD_BALANCE = yes)

       (CONNECT_DATA =

         (SERVER = DEDICATED)

          (SERVICE_NAME = taf_server)

         (FAILOVER_MODE =

           (TYPE = SELECT)

           (METHOD = BASIC)

           (RETRIES = 180)

           (DELAY = 5)

          )

        )

      )

    注意:

    不管使用DBCA还是srvctl命令来配置service,都无法配置TAF的type,delay,retries这三个属性,必须使用dbms_service包来改动这些属性。

     

     

    5.測试Server-Side TAF

    在oracle 10g中配置Server-Side TAF之后,client甚至都不须要tnsnames.ora文件而是使用Oracle 10g提供的新连接方法Easy Connect Naming Methods。这一届就使用这样的方法来測试Server-SideTAF.測试之前能够把client的tnsnames.ora文件改名存放,以保证client在没有TNS的情况下进行这个測试。使用Easy Connecting Methods时的连接串格式例如以下:

     

    username/password@[//]host[:port][/service_name]

     

    (1) 从一个client连接,而且窗体一直保持打开;

    [root@felix1 bin]# cat /etc/hosts

    127.0.0.1      localhost

     

    192.168.10.101       felix1      

    192.168.10.111       felix1-vip  

    192.168.20.30        felix1-priv 

     

    192.168.10.102       felix2

    192.168.10.122       felix2-vip

    192.168.20.40        felix2-priv

     

    [root@felix1 bin]#

     

     

    [oracle@felix1 ~]$sqlplus scott/oracle@felix1-vip/felix_ora

     

    SQL*Plus: Release 10.2.0.5.0 - Production on ThuMay 29 23:01:49 2014

     

    Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

     

     

    Connected to:

    Oracle Database 10g Enterprise Edition Release10.2.0.5.0 - Production

    With the Partitioning, Real Application Clusters,OLAP, Data Mining

    and Real Application Testing options

     

     

    (2) 运行查询

    SQL> select instance_name from v$instance;

     

    INSTANCE_NAME

    ----------------

    felix2

     

    SQL>

    能够看到连接到实例2上了

    SQL> select name,failover_method,failover_type,clb_goal from dba_services;

     

    NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

    ----------------------------------------------------------------- -------------------- ---------------

    SYS$BACKGROUND                                                                         SHORT

    SYS$USERS                                                                              SHORT

    seeddataXDB                                                                            LONG

    seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

    felixXDB                                                                               LONG

    felix                                                                                   LONG

    taf_server                                                                             LONG

    taf_srvctl                                                                             LONG

    felix_ora                                          BASIC           SELECT               LONG

     

    9    rows selected.

     

    (3) 在实例2上,杀掉这个会话相应的server process。

     

    SQL> select pid,spid from v$process

         where addr in

         (select paddr from v$session whereusername='SCOTT');

     

           PIDSPID

    ---------- ------------

            298154

     

    SQL>

     

    该连接相应的OS进程PID=8154,在OS上杀掉这个进程:

    [root@felix2 ~]# ps -ef | grep  8154 |grep -v grep

    oracle   8154     1  0 23:01 ?        00:00:00 oraclefelix2 (LOCAL=NO)

    [root@felix2 ~]# kill  -9 8154

    [root@felix2 ~]#

    (4)在会话中运行语句

    SQL> select instance_name from v$instance;

    select instance_name from v$instance

    *

    ERROR at line 1:

    ORA-03113: end-of-file on communication channel

    等一会儿再在会话中运行

     

    SQL> /

     

    INSTANCE_NAME

    ----------------

    felix2

     

    SQL> /

    注意:

    (感觉这个实验似乎有些问题,实验时候还是failover到实例2上了,可是我做了一个把实例2shutdown abort的实验,结果例如以下:

    SQL>/

     

    INSTANCE_NAME

    ----------------

    felix1

    这次正确failover到了实例2上,kill会话这个实验有所不当,建议用abort;

     

    (5)測试完成,清理环境,删除service

    [oracle@felix1 ~]$ srvctl stop service  -d felix -s felix_ora

    [oracle@felix1 ~]$ srvctl status service  -d felix -s felix_ora

    Service felix_ora is not running.

    [oracle@felix1 ~]$ srvctl remove service  -d felix -s felix_ora

    felix_ora PREF: felix1 AVAIL: felix2

    Remove service felix_ora from the database felix?(y/[n]) y

    [oracle@felix1 ~]$ srvctl config  service -d felix -a

    [oracle@felix1 ~]$

    注意:OCR中的内容被删除完了,可是数据字典里还有Service的内容,继续清除数据字典里的内容。查看数据字典内容:

    SQL> selectname,failover_method,failover_type,clb_goal from dba_services;

     

    NAME                                               FAILOVER_METHOD FAILOVER_TYPE        CLB_GOAL

    ----------------------------------------------------------------- -------------------- ---------------

    SYS$BACKGROUND                                                                         SHORT

    SYS$USERS                                                                              SHORT

    seeddataXDB                                                                            LONG

    seeddata.regress.rdbms.dev.us.oracle.com                                                LONG

    felixXDB                                                                               LONG

    felix                                                                                  LONG

    taf_server                                                                              LONG

    taf_srvctl                                                                             LONG

    felix_ora                                         BASIC           SELECT               LONG

     

    9 rows selected.

     

    SQL>

     

    删除数据字典内容:

     

    Begin

        Dbms_service.delete_service(service_name=>’felix_ora’);

    End;

    SQL>begin

      2 dbms_service.delete_service(service_name=>'felix_ora');

      3  end;

      4  /

     

    PL/SQLprocedure successfully completed.

     

    SQL>

     

    在此查询数据字典:

    SQL> select name,failover_method,failover_type,clb_goalfrom dba_services;

     

    NAME                                              FAILOVER_METHOD FAILOVER_TYPE       CLB_GOAL

    ----------------------------------------------------------------- -------------------- ---------------

    SYS$BACKGROUND                                                                         SHORT

    SYS$USERS                                                                              SHORT

    seeddataXDB                                                                            LONG

    seeddata.regress.rdbms.dev.us.oracle.com                                               LONG

    felixXDB                                                                               LONG

    felix                                                                                   LONG

     

    6 rows selected.

     

    此时,已经清除干净!!


















  • 相关阅读:
    oracle调用存储过程和函数返回结果集
    怎样让Oracle的存储过程返回结果集
    Java 调用存储过程 返回结果集
    oracle多表关联删除数据表记录方法
    ORACLE多表关联UPDATE 语句
    Oracle--用户管理与权限分配
    java代码开启关闭线程(nginx)
    netty实现websocket客户端(附:测试服务端代码)
    netty同时实现http与socket
    Oracle-控制语句
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4089846.html
Copyright © 2011-2022 走看看