oracle rac 11gr2中提供了多种 failover方式,这里只测试 server side TAF. 也就是说在server端配置的failover。这种配置方式的好处就是,如果有什么改动可以在server端改动,不必去多个client端改。OK 实验步骤如下:
首先,创建service
[oracle@racnode1 ~]$ srvctl add service -d orcl -s my_service -r "orcl1" -a "orcl2" -P basic
然后,启动service并查看状态。 可以看到service启动在了orcl1上。因为我们指定的preferred instance 就是orcl1.
[oracle@racnode1 ~]$ srvctl start service -d orcl -s my_service [oracle@racnode1 ~]$ srvctl status service -d orcl -s my_service Service my_service is running on instance(s) orcl1
我们也可以进入两个instance来看一下service 启动在了哪。
SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- orcl1 SQL> show parameter service_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ service_names string my_service SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- orcl2 SQL> show parameter service_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ service_names string orcl
现在我们进入orcl DB运行下列代码来配置service 的TAF属性
begin dbms_service.modify_service( service_name=>'my_service', failover_method=>dbms_service.failover_method_basic, failover_type=>dbms_service.failover_type_select, failover_retries=>2, failover_delay=>5); end;
运行完上面的dbms_service包来修改service的TAF配置后可以运行下面的SQL查看更改是否生效。
SQL> select name,failover_method,failover_type from dba_services where name='my_service'; NAME FAILOVER_METHOD FAILOVER_TYPE ---------------------------- ---------------------------- ---------------------------- my_service BASIC SELECT
OK. 现在service已经运行起来了,运行在了orcl1上并且配置好了TAF。 我们尝试从客户端发起连接并且,手动的模拟故障,看看该连接是不是会failover到其它Instance。
发起连接。
[oracle@racnode2 ~]$ sqlplus scott/passw0rd@192.168.3.165/my_service SQL*Plus: Release 11.2.0.3.0 Production on Tue Jul 2 17:14:37 2013 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- orcl1
可见该连接connect到了orcl1上。因为我们用service name来连 当然会连到orcl1上。
通过下面的几个命令,找出该连接的 os pid
SQL> select sid from v$mystat where rownum<2; SID ---------- 61 SQL> select spid from gv$process where addr in ( select paddr from gv$session where inst_id=1 and sid=61); SPID ------------------------ 24845
去instance 1 所在机器kill -9 24845。 这样就可以实现模拟故障。
这时在该session再次运行下面的SQL会出现如下结果。
SQL> select sid from v$mystat where rownum<2; select sid from v$mystat where rownum<2 * ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 25024 Session ID: 59 Serial number: 18071
这说明这时候的 session有故障了。
但是过几秒钟我们再试一下。
SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- orcl1
连接恢复