Oracle RAC的TAF简单测试

Oracle的RAC的高可用功能除了负载均衡还包括TAF(Transparent Application Failover)。

RAC的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)
)
)

现在没有配置TAF,连接数据库,检查实例信息:

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

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

下面关闭TESTRAC2实例:

$ srvctl stop instance -d testrac -i testrac2

再次检查刚才连接的会话:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
SELECT INSTANCE_NAME FROM V$INSTANCE
*第 1 行出现错误:
ORA-03113: 通信通道的文件结束


SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
ERROR:
ORA-03114: 未连接到 ORALCE

执行操作后,Oracle会报上面的错误。下面启动服务,配置TAF:

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)
)
)
)

$ srvctl start instance -d testrac -i testrac2

重新登陆,检查实例信息:

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

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

再次关闭实例:

$ srvctl stop instance -d testrac -i testrac1

检查刚才的连接的会话:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
SELECT INSTANCE_NAME FROM V$INSTANCE
*第 1 行出现错误:
ORA-25408: 无法安全重放调用


SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

虽然报了一个错误ORA-25408,但是再次执行的时候,Oracle已经自动切换到实例TESTRAC2上了。

启动TESTRAC1实例,然后关闭TESTRAC2实例:

$ srvctl start instance -d testrac -i testrac1
$ srvctl stop instance -d testrac -i testrac2

再次检查连接情况:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
SELECT INSTANCE_NAME FROM V$INSTANCE
*第 1 行出现错误:
ORA-25408: 无法安全重放调用


SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

Oracle成功的切换回testrac1实例。Oracle这里也存在一个问题,就是会产生ORA-25408错误。Oracle给出的解决方法是应用程序对这个错误进行处理。

如果将FAILOVER的TYPE改为SELECT模式,则也不会出现这个错误,首先修改TNSNAMES中的设置:

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)
)
)
)

然后启动刚才关闭的TESTRAC2实例:

$ srvctl start instance -d testrac -i testrac2

重新连接到实例:

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

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

关闭TESTRAC1实例:

$ srvctl stop instance -d testrac -i testrac1

检查会话连接的情况:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

这时第一次执行SQL就成功了,没有在出现ORA-25408错误。

 

上一篇简单介绍了TAF,并通过具体的说明了SESSION和SELECT的区别。但是那个例子展示的只是二者区别的一个现象而已。真正的区别在于,配置了SELECT选项的FAILOVER在数据库实例失败时,会将会话切换到另一个实例,且将实例失败时运行的SELECT语句继续执行,并返回正确的结果。而SESSION则不具备这个功能。

先看看FAILOVER设置为SESSION的情况:

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)
)
)
)

下面先看看FAILOVER设置为SESSION的情况:

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

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

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
XDB$STATS$xd
XDB$CONFIG$xd
XDBCONFIG_VALIDATE
XDB_RV_TRIG
XDB_PV_TRIG
CWM$DIMENSIONDEL
CWM$CUBEDEL
CWM2$AWVIEWSUPD
CWM2$AWVIEWCOLSUPD
CWM$CLASSIFICATIONUPD
.
.
.
EM_TARGETS_DELETE
BLACKOUT_CHANGE
BLACKOUT_STATUS
UPDATE_SOURCE
BLACKOUT_WINDOW_INSERT
HANDLE_RELATED_TARGETS
MGMT_METRIC_COLL_INS

利用PAUSE的暂停功能,然后在另一个会话中关闭当前连接实例:

$ srvctl stop instance -d testrac -i testrac2

返回刚才执行SQL的窗口,按回车继续:

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-25401: 无法继续读取

已选择105行。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;


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

虽然SELECT操作失败了。但是再次执行SQL时成功了。而且会话已经切换到了另外一个实例上。

从上面的结果也可以看到SQLPLUS的一些处理方法。PAUSE主要起作用在执行后和每一页的结束后。

而PAUSE和SQL结果的提取是没有关系的。这也是为什么在PAUSE继续执行之后,仍然得到了一些记录的原因。

而且从最终获取105条记录也可以看出,Oracle的FETCH操作是通过数组进行的,在PAUSE的时候,这次数组提取已经完成。而PAUSE结束后,本次获取的数据可以显示,再次提取的时候出现了错误。

SQL> SHOW ARRAY
arraysize 15

可以看到,Oracle实际执行了7次提取操作。

上面扯远了一点,下面继续看FAILOVER的SELECT表现。

首先修改tnsnames.ora中FAILOVER的配置:

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)
)
)
)

然后将刚才管理的instance启动:

$ srvctl start instance -d testrac -i testrac2

下面同样执行上面那个SQL,注意这里必须重新登陆一次,否则客户端

TNSNAMES的修改无法对当前会话生效:

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

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

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
XDB$STATS$xd
XDB$CONFIG$xd
XDBCONFIG_VALIDATE
XDB_RV_TRIG
XDB_PV_TRIG
.
.
.
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
METRIC_ERRORS_CUR_AND_DUPES
SEVERITY_DELETE
INSERT_FLAT_TARGETS
MGMT_JOB_EXEC_INSERT
JOB_CMD_BLK_DELETE_TRIGGER
JOB_EXEC_DELETE_TRIGGER
.
.
.
SDO_DROP_USER_BEFORE
SDO_DROP_USER
SDO_GEOR_DROP_USER
SDO_NETWORK_DROP_USER
SDO_GEOR_TRUNC_TABLE

已选择164行。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;


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

这次不但将会话切换到了正常的实例上,而且SELECT也得到了完整的结果,没有因实例故障而出现错误。这就是FAILOVER的SESSION和SELECT设置的区别。

 

这篇简单讨论一下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的修改生效。采用上一篇文章的方法,利用SQLPLUS的PAUSE命令观察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是针对SESSION和SELECT的,它不支持事务的切换。其实想想也是有道理的,当连接的实例发生了故障,客户端的连接发生了切换之后,SESSION信息、INSTANCE信息以及其他很多事务依赖的东西都不存在了,Oracle为了保证事务的完整性和一致性,必要要求用户回滚事务。

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

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

 

 

这篇简单讨论一下TAF的BASIC方式和PRECONNECT方式。

TAF有两种切换方式,BASIC方式和PRECONNECT方式。对于BASIC方式,所有设置了TAF的会话在当前实例失败后,会连接到另外一个实例上。而对于PRECONNECT方式,每个连接的会话在主实例和备份实例上各连接一个会话,一旦主实例失败,可以迅速的切换到备份实例。

首先看看普通BASIC方式的tnsnames.ora的设置:

TESTRAC_BASIC =
(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)
)
)
)

下面看看PRECONNECT的配置:

TESTRAC_PRE1 =
(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 = PRECONNECT)
(BACKUP = TESTRAC_PRE2)
)
)
)

TESTRAC_PRE2 =
(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 = PRECONNECT)
(BACKUP = TESTRAC_PRE1)
)
)
)

对于BASIC方式的TAF:

SQL> CONN TEST/TEST@TESTRAC_BASIC已连接。
SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER
2 FROM V$SESSION
3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI
---------- ------------- ---------- ---
130 SELECT BASIC NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

通过SET TIMING ON来检查观察切换时间:

SQL> SET TIMING ON
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.25
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.00

在执行查询的同时在另外的窗口关闭实例1:

bash-2.03$ srvctl stop instance -d testrac -i testrac1

下面看看PRECONNECT的情况,首先开启实例:

bash-2.03$ srvctl start instance -d testrac -i testrac1

通过TESTRAC_PRE1服务名连接数据库:

SQL> SET TIMING OFF
SQL> CONN TEST/TEST@TESTRAC_PRE1已连接。
SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER
2 FROM V$SESSION
3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);
SID FAILOVER_TYPE FAILOVER_M FAI
---------- ------------- ---------- ---
149 SELECT PRECONNECT NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

执行刚才的操作,检查PRECONNECT的TAF情况:

SQL> SET TIMING OFF
SQL> CONN TEST/TEST@TESTRAC_PRE1已连接。
SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER
2 FROM V$SESSION
3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI
---------- ------------- ---------- ---
149 SELECT PRECONNECT NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

SQL> SET TIMING ON
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.00
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.00
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

已用时间: 00: 00: 00.01

在查询的同时管理实例testrac1:

bash-2.03$ srvctl stop instance -d testrac -i testrac1

数据库负载很小,而且会话需要恢复的操作不多,所以切换时所需的时间不长,不过即使是这样,通过对比BASIC和PRECONNECT所需的切换时间,也可以看到明显的区别。

 

 

这篇简单讨论一下TAF服务器端的PRECONNECT设置。

上一篇讨论了客户端配置PRECONNECT方式的TAF,下面介绍一下RAC服务器端设置PRECONNECT服务的方法:

通过图形界面启动dbca;

在欢迎界面选择Oracle Real Application Cluster database;

选择Service Management;

选择CLUSTER数据库,这里是testrac;

在Database Service界面添加要启动的服务:PRE_TESTRAC,然后将TAF策略修改为Pre-connect,点击Finish,完成配置。

这是服务器端的tnsnames.ora中添加了下面的配置:

PRE_TESTRAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRE_TESTRAC)
(FAILOVER_MODE =
(BACKUP = PRE_TESTRAC_PRECONNECT)
(TYPE = SELECT)
(METHOD = PRECONNECT)
(RETRIES = 180)
(DELAY = 5)
)
)
)

PRE_TESTRAC_PRECONNECT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRE_TESTRAC_PRECONNECT)
(FAILOVER_MODE =
(BACKUP = PRE_TESTRAC)
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

同时,通过srvctl可以监控、管理建立的PER_TESTRAC服务:

bash-2.03$ srvctl status service -d testrac
Service PRE_TESTRAC is running on instance(s) testrac2, testrac1

建立了服务之后,客户端可以直接配置PRE_TESTRAC这个服务,比如客户端tnsnames.ora的配置为:

PRE_TESTRAC_SERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRE_TESTRAC)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = PRECONNECT)
(BACKUP = PRE_TESTRAC_PRECONNECT)
)
)
)

通过服务名PRE_TESTRAC_SERVICE建立的连接就启用了PRECONNECT的TAF:

SQL> CONN TEST/TEST@PRE_TESTRAC_SERVICE已连接。
SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER
2 FROM V$SESSION
3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI
---------- ------------- ---------- ---
127 SELECT PRECONNECT NO

 

 

 

 

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

转载于:http://blog.itpub.net/22198259/viewspace-659770/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值