热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

【Oracle】RACfailover切换之TAF

OracleRAC客户端故障转移(failover),当采用TAF方式时,对于已经建立连接的客户端,在连接的实例或节点出现故障时,客户端无需

Oracle RAC 客户端故障转移(failover),当采用TAF方式时,对于已经建立连接的客户端,在连接的实例或节点出现故障时,客户端无需

Oracle RAC 客户端故障转移(failover),当采用TAF方式时,对于已经建立连接的客户端,在连接的实例或节点出现故障时,客户端无需再次发出连接请求,仍然可以继续之前的数据库操作,此称之为透明故障转移。

使用TAF,需要配置客户端tnsnames.ora文件,在其中增加了failover_mode选项,failover=on是默认配置,不写也行。

今天试验验证type=select和type=session的区别。

这两种参数的设置在实例崩溃时都会对事务进行回滚,其不同之处在于对于节点崩溃时正在执行的select语句的处理。type=select会将正在执行的select语句转移到新的节点上继续执行返回后续的结果集,而type=session则会终止查询,想要再此查询需要重新运行select语句,从头开始进行查询。

假设用户正在节点1上执行查询,整个结果集共有100条记录,现在已从节点1上返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session模式,则需要重新执行查询语句;如果是select方式,会从节点2上继续返回剩下的90天记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言,感受不到这种切换。

显然为了实现select 方式,Oracle 必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。

下面开始进行试验

一、type=select

tnsnames配置如下

RACDB=

(description =

(address = (protocol = tcp)(host = 192.168.1.201)(port = 1521))

(address = (protocol = tcp)(host = 192.168.1.202)(port = 1521))

(load_balance = yes)

(connect_data =

(server = dedicated)

(service_name = RACDB)

(failover_mode =

(type = select)

(method = preconnect)

(retries = 180)

(delay = 5)

)

)

)

实验开始:

首先连接到RAC后查看此时的instance_name,并运行查询语句

[oracle@jp admin]$ sqlplus sys/oracle@RACDB as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 5 06:17:10 2014

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

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

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

SYS@RACDB>show parameter instance_name

NAME TYPE VALUE

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

instance_name string RACDB1

SYS@RACDB>select * from dba_objects;

...........

在执行过程中将RACDB1 shutdown abort模拟节点崩溃

SYS@RACDB1>shutdown abort

ORACLE instance shut down.

此时查询卡住几秒钟后,继续返回查询结果,不用重新运行查询语句。

二、type=session

tnsnames.ora配置如下

RACDB=

(description =

(address = (protocol = tcp)(host = 192.168.1.201)(port = 1521))

(address = (protocol = tcp)(host = 192.168.1.202)(port = 1521))

(load_balance = yes)

(connect_data =

(server = dedicated)

(service_name = RACDB)

(failover_mode =

(type = session)

(method = preconnect)

(retries = 180)

(delay = 5)

)

)

)

实验开始

SYS@RACDB>show parameter instance_name

NAME TYPE VALUE

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

instance_name string RACDB2

SYS@RACDB>select * from dba_objects;

省略。。。。。。

此时将RACDB2 shutdown abort

SYS@RACDB2>shutdown abort

ORACLE instance shut down.

此时查询卡住,几秒钟后报错并给出已查询的行数

ERROR:

ORA-25401: can not continue fetches

750 rows selected.

SYS@RACDB>

查询此时的instance_name

SYS@RACDB>show parameter instance_name

NAME TYPE VALUE

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

instance_name string RACDB1

已经自动切换到RACDB1上,但查询语句已经中断。

客户端TAF还包括其他一些参数:

method=perconnect/basic

basic:只有当感知到当前节点发生故障时才连接到其他节点

perconnect:在最初建立连接的时候就建立到所有实例的连接,当前节点发生故障可以快速切换到其他实例上。

两个参数的设置区别就在于当前节点出现错误,转换到其他节点上所花的时间的长短,perconnect固然速度会很快,但是也会消耗一定的额外资源,换句话说就是拿资源换速度。如何取舍可根据实际情况自己确定。

load_blance=on/off

推荐阅读
author-avatar
手机用户2502929967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有