ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【TAF】使用Oracle RAC的TAF技术之SESSION类型

【TAF】使用Oracle RAC的TAF技术之SESSION类型

Linux操作系统 作者:kingsql 时间:2014-08-14 12:02:54 0 删除 编辑
《【TAF】使用Oracle RAC的TAF技术实现不间断查询》(http://space.itpub.net/519536/viewspace-676654)文中谈到当FAILOVER_MODE类型为SELECT时可以实现查询语句不间断的返回结果。另外一种类型是SESSION,看一看SESSION类型会给我们带来什么样的效果。

1.在tnsnames.ora文件中添加测试连接串
RACDB1@rac1 /home/oracle$ vi $ORACLE_HOME/network/admin/tnsnames.ora
testractafsession =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RACDB)
      (FAILOVER_MODE =
        (TYPE = SESSION)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

注意,此处配置的FAILOVER_MODE中的TYPE是“SESSION”。

2.使用testractaf连接串连接到数据库
RACDB1@rac1 /home/oracle$ sqlplus sec/sec@testractafsession

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 25 21:16:47 2010

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

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
RACDB1

可见,此时sqlplus连接到了RAC的第一个实例RACDB1上。

3.手工停止RACDB1实例
[root@rac2 ~]# srvctl stop instance -d RACDB -i RACDB1

4.重新确认查询语句所在实例
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-25408: can not safely replay call


SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
RACDB2

此时在原sqlplus界面下提交查询SQL语句后立即收到“ORA-25408: can not safely replay call”错误,但是,再次提交同样的查询便会得到结果,结果表明此时已经切换到另外一个实例RACDB2上。
这里的报错和不使用TAF技术的报错是有本质区别的,这里最重要的优势是:不需要重新发起连接。

5.恢复实例RACDB1,继续
[root@rac2 ~]# srvctl start instance -d RACDB -i RACDB1
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
RACDB2

6.此处我们模拟一个长时间无法返回全部信息的查询语句
SQL> select * from all_objects a,all_objects b,all_objects c where a.object_id=b.object_id and a.object_id=c.object_id;

…… 此处省略输出信息 ……

7.手工停止RACDB2实例
[root@rac2 ~]# crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora....B1.inst application    ONLINE    ONLINE    rac1
ora....B2.inst application    ONLINE    ONLINE    rac2
ora.RACDB.db   application    ONLINE    ONLINE    rac2
ora....DB1.srv application    ONLINE    ONLINE    rac1
ora....DB2.srv application    ONLINE    ONLINE    rac2
ora.....taf.cs application    ONLINE    ONLINE    rac1
ora....SM1.asm application    ONLINE    ONLINE    rac1
ora....C1.lsnr application    ONLINE    ONLINE    rac1
ora.rac1.gsd   application    ONLINE    ONLINE    rac1
ora.rac1.ons   application    ONLINE    ONLINE    rac1
ora.rac1.vip   application    ONLINE    ONLINE    rac1
ora....SM2.asm application    ONLINE    ONLINE    rac2
ora....C2.lsnr application    ONLINE    ONLINE    rac2
ora.rac2.gsd   application    ONLINE    ONLINE    rac2
ora.rac2.ons   application    ONLINE    ONLINE    rac2
ora.rac2.vip   application    ONLINE    ONLINE    rac2
[root@rac2 ~]# srvctl stop instance -d RACDB -i RACDB2
[root@rac2 ~]# crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora....B1.inst application    ONLINE    ONLINE    rac1
ora....B2.inst application    OFFLINE   OFFLINE
ora.RACDB.db   application    ONLINE    ONLINE    rac2
ora....DB1.srv application    ONLINE    ONLINE    rac1
ora....DB2.srv application    ONLINE    OFFLINE
ora.....taf.cs application    ONLINE    ONLINE    rac1
ora....SM1.asm application    ONLINE    ONLINE    rac1
ora....C1.lsnr application    ONLINE    ONLINE    rac1
ora.rac1.gsd   application    ONLINE    ONLINE    rac1
ora.rac1.ons   application    ONLINE    ONLINE    rac1
ora.rac1.vip   application    ONLINE    ONLINE    rac1
ora....SM2.asm application    ONLINE    ONLINE    rac2
ora....C2.lsnr application    ONLINE    ONLINE    rac2
ora.rac2.gsd   application    ONLINE    ONLINE    rac2
ora.rac2.ons   application    ONLINE    ONLINE    rac2
ora.rac2.vip   application    ONLINE    ONLINE    rac2

8.结论
当RACDB2实例终止后,持续返回的结果信息被中断,紧随其后的是报错信息“ORA-25401: can not continue fetches”,在报错的同时该连接已经重新连接到其他可用的数据库实例上,后续的SQL语句不受影响。

错误提示信息如下:
…… 省略输出信息 ……
…… 省略输出信息 ……
ERROR:
ORA-25401: can not continue fetches



2085 rows selected.

SQL>
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
RACDB1

9.小结
本文给出了当故障来临时在FAILOVER_MODE中TYPE选择“SESSION”时的应对特点,此时与“SELECT”类型有一些区别。实例故障出现时,这里选择了报错并终止。在这种配置下可以结合具体应用来应对这些报错。在具体应用设计的过程中需要充分考虑Failover不同模式下的应对方案。

Good luck.

secooler
10.10.25

-- The End --

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28389881/viewspace-1251093/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OCM

注册时间:2013-02-28

  • 博文量
    225
  • 访问量
    800254