现在我们已经安装了RAC有两个instance组成。
1. RAC1服务器上:
RACDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521))
      (LOAD_BALANCE = on)
      (FAILOVER = on)
    )
    (CONNECT_DATA =
      (SERVICE_NAME = racdb)
      (failover_mode =
        (type = select)
        (method = basic)
      )
    )
  )RACDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = racdb)
      (INSTANCE_NAME = racdb1)
    )
  )2. RAC2服务器上:
RACDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521))
      (LOAD_BALANCE = on)
      (FAILOVER = on)
    )
    (CONNECT_DATA =
      (SERVICE_NAME = racdb)
      (failover_mode =
        (type = select)
        (method = basic)
      )
    )
  )RACDB2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = racdb)
      (INSTANCE_NAME = racdb2)
    )
  )3. 在JNDI上我们是按照“Connect-Time Failover”的模式来配置的,想做成主备模式,比如以下主用101,只有101failed情况下才自动切换到102:
RACDB1_FAILOVER =
 (DESCRIPTION= 
   (FAILOVER=on)
   (LOAD_BALANCE=off)
   (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.101)(PORT=1521)) 
   (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.102)(PORT=1521))  
   (CONNECT_DATA=
     (SERVER=DEDICATED)
     (SERVICE_NAME=RACDB)
     (failover_mode =
       (type = select)(method = basic)
     )
   )
  )
按照这种配置模式的特点
One service(Tries one node,then the other node)
Used for failover
Balance is done manually
In the event of a failure(Transaction is lost;Session is lost; Reconnection occurs automatically)
load balance应该是按照先101,只有101失败才try102.
但是实际从数据库表sequence的生产来看,还是两个instance交替使用。请问,这是为什么?还是有什么地方配置有问题?请高手指点!多谢!

解决方案 »

  1.   

    JNDI属于pool的方式连接吧.我没记错的话.
    如果是这样,你就要配置server端的TAF了.
      

  2.   

    多谢liuyi8903的回复。
    也就是说,在pool的连接方式下,即使客户端JNDI配置成Connect-Time Failover的模式,实际还是使用了服务端的RACDB的配置方式?
    如果要使客户端的Connect-Time Failover的模式生效,是不是直接把服务端的RACDB配置改了就行?(比如服务器RAC1上面的RACDB改成和RACDB1_FAILOVER一样)?
      

  3.   

    如果是pool ,那么是预连接的.因此你这个client端的taf并没有什么实际的意义.但是使用server -side taf就是在服务器端来进行控制.
      

  4.   

    谢谢回复!
    你说的连接池的预连接,它不使用client端(JNDI)的配置来做预连接吗?
    那服务端的TAF需要怎么做呢?
      

  5.   

    jndi我也不清楚啊,像ias wbs什么就是pool的形式.server taf需要配置其他的service_name
      

  6.   

    JNDI的确是使用的连接池。那server端的TAF还需要配置其他的Service name?不能在现有的基础上直接修改服务器RAC1和RAC2上的tnsnames.ora吗?
      

  7.   

    谢谢liuyi8903的回复!之前Server端的TAF的service name的配置不是我来做的。请问能给出如何配置的步骤吗?
      

  8.   

    你需要使用dbca来管理services或者使用srvctl add ,dbca简单些.
      

  9.   

    如果你用的是10gR2的话,可以用dbms_service包在server端配置TAFSQL>exec dbms_service.modif_service(service_name=>'racdb',failover_method=>'basic',failover_type=>'select',failover_retries=>50,failover_delay=>5);
      

  10.   

    dbca最简单啦. dbms_service对于捕获错误方便些.
      

  11.   

    非常感谢大家的帮助!我们使用的oracle 9i RAC。已经了解如何用DBCA配置server端的TAF。只是因为数据库已经在使用中(生产环境),无法随意操作。现在还是有点困惑,为何JNDI的连接池并不能使用客户端的配置的TAF。