FAILOVER有两种方式:
一种称做连接时的FAILOVER,它是指当用户按照tnsnames.ora文件中的配置信息,尝试去连接一个指定的监听器失败时,将自动连接另外一个地址。(需要设定:FAILOVER=on)
另一种FAILOVER方式发生在会话连接已经建立之后,此时发生的FAILOVER被称作TAF,当用户在一个实例上操作失败时,允许重新连接到另一个实例上继续进行操作。
TAF有两种工作模式:SESSION模式和SELECT模式
SESSION模式 - 当会话在某个实例上操作失败时,TAF可以重新创建会话并连接到新的实例上。
SELECT模式 - 如果一个正在执行的查询在某个实例上发生故障,TAF将会在另一个实例上重新执行这个查询。
TAF使用的参数:
BACKUP 指定一个备用的连接信息,当需要使用TAF预先连接功能时,需要提供这个信息
TYPE=SESSION模式 如果一个会话丢失连接,TAF会在BACKUP实例上重新创建一个会话,但它不会重新执行SELECT操作,仅仅是自动创建一个会话
TYPE=SELECT模式 如果一个SELECT正在执行时失败,TAF会重新执行它
TYPE=NONE 不实用TAF,这是默认值
METHOD=BASIC 当发生故障时,将会话FAILOVER到BACKUP实例上
METHOD=PRECONNECT 提前和BACKUP实例建立连接,缺点是这样将导致BACKUP实例上有更多的连接;优点是它提供了更快的切换时间
RETRIES 当发生一次FAILOVER后,这个参数指定重连的次数,如果指定了DELAY选项,它的默认值是5次
DELAY 指定RETRIES的间隔时间,如果指定了RETRIES,它的默认值是1秒
下面是一个实际的例子:下面是tnsnames.ora的配置
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.oraclerac.com)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = ON) --FAILOVER主要就是通常这个参数控制
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 30)
(DELAY = 5)
)
)
)
然后建立一个连接:
SQL> conn scott/tiger@orcl2
已连接。
SQL> select INSTANCE_NAME from v$instance;
INSTANCE_NAME
----------------
orcl2
SQL> select count(*) from emp;
COUNT(*)
----------
14
关闭实例2:
[grid@linux1 ~]$ srvctl status instance -d orcl -i orcl2
实例 orcl2 正在节点 linux2 上运行
[grid@linux1 ~]$ srvctl stop instance -d orcl -i orcl2
[grid@linux1 ~]$ srvctl status instance -d orcl -i orcl2
实例 orcl2 没有在 linux2 节点上运行
再次查询:
SQL> select count(*) from emp;
COUNT(*)
----------
14
SQL> select INSTANCE_NAME from v$instance;
INSTANCE_NAME
----------------
orcl1