RAC的TAF简单测试(三)---转

本文通过实验展示了Oracle RAC中TAF(透明应用程序故障转移)对于不同事务类型的影响。测试发现,TAF能实现查询的自动转移,但对于正在进行的事务处理则要求回滚。此外,还探讨了不同配置下TAF的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

===========================================================
RAC的TAF简单测试(三)
===========================================================

OracleRAC的高可用功能除了负载均衡还包括TAFTransparent Application Failover)。

RACTAF是指会话连接到一个实例上,如果这个实例出现了故障,Oracle会自动将会话迁移到另一个实例上。

这篇简单讨论一下TAF对事务的影响。


上一篇讨论的主要是TAF对查询的影响,那么Oracle是否也能对数据的修改进行TAF,下面来看一个例子。

客户端tnsnames.ora中的设置如下:

TESTRAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testrac)
(FAILOVER_MODE =
(TYPE = SESSION)
(METHOD = BASIC)
)
)
)

下面尝试进行修改:

SQL> CONN TEST/TEST@TESTRAC已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> CREATE TABLE T (ID NUMBER);

表已创建。

SQL> INSERT INTO T VALUES (1);

已创建 1 行。

然后关闭当前连接的实例:

$ srvctl stop instance -d testrac -i testrac1

返回SQLPLUS界面执行任意SQL

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
SELECT INSTANCE_NAME FROM V$INSTANCE
*
1 行出现错误:
ORA-25402:
事务处理必须重新运行


SQL> SELECT * FROM T;
SELECT * FROM T
*
1 行出现错误:
ORA-25402:
事务处理必须重新运行


SQL> DELETE T;
DELETE T
*
1 行出现错误:
ORA-25402:
事务处理必须重新运行


SQL> COMMIT;
COMMIT
*
1 行出现错误:
ORA-25402:
事务处理必须重新运行


SQL> ROLLBACK;

回退已完成。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

可以看到,切换虽然成功了,但是执行任何操作都会返回ORA-25402错误,除非执行ROLLBACK操作。

SESSION模式改为SELECT模式:

TESTRAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testrac)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
)
)
)

启动刚才关闭的实例:

$ srvctl start instance -d testrac -i testrac1

重新连接,使得客户端tnsnames.ora的修改生效。采用上一篇文章的方法,利用SQLPLUSPAUSE命令观察SELECT模式在进行了修改之后,是如何进行TAF的:

SQL> CONN TEST/TEST@TESTRAC已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> INSERT INTO T VALUES (1);

已创建 1 行。

SQL> SET PAUSE ON
SQL> SELECT TRIGGER_NAME FROM DBA_TRIGGERS;


TRIGGER_NAME
------------------------------
DEF$_PROPAGATOR_TRIG
REPCATLOGTRIG
XDB$ACL$xd
xdb-log9_TAB$xd
SERVLET$xd
ftp-log14_TAB$xd
http-log20_TAB$xd
Folder23_TAB$xd
.
.
.
UPDATE_SOURCE
BLACKOUT_WINDOW_INSERT
HANDLE_RELATED_TARGETS
MGMT_METRIC_COLL_INS

下面关闭连接的实例:

$ srvctl stop instance -d testrac -i testrac1

返回SQLPLUS敲回车继续:


TRIGGER_NAME
------------------------------
MGMT_CREDS_UPD
MASTER_AGENT_CHANGE_TRIGGER
METRICS_INSERT_TRIGGER
TARGET_PROP_DEFS_TR
METRICS_DELETE
TARGETS_INSERT_TRIGGER
CHECK_DUPLICATE_TARGETS
RAW_METRICS_AFTER_INSERT
ERROR:
ORA-25402:
事务处理必须重新运行

已选择105行。

现在得到了和昨天测试完全不一样的结果。

上面的测试说明两点问题。

首先,TAF是针对SESSIONSELECT的,它不支持事务的切换。其实想想也是有道理的,当连接的实例发生了故障,客户端的连接发生了切换之后,SESSION信息、INSTANCE信息以及其他很多事务依赖的东西都不存在了,Oracle为了保证事务的完整性和一致性,必要要求用户回滚事务。

第二,SELECT模式的TAF只对不包含任何事务处理的查询有效。一旦用户执行了修改操作,SELECT模式也无法在TAF之后将进行一半的查询完成。

最后,如果启用了TAF功能,那么程序必须要添加处理ORA-25402错误的能力,否则一旦发生TAF切换,程序将一直报错,而无法再进行任何操作。

TAF简单测试一:http://space.itpub.net/110321/viewspace-614861

TAF简单测试二:http://space.itpub.net/110321/viewspace-614862

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

转载于:http://blog.itpub.net/110321/viewspace-614863/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值