每个数据库都有一个或多个service名称,service名称是提供给客户端连接到数据库实例的名称。
创建数据库会默认创建与数据库同名的service,默认的service实现所有实例的负载均衡,可以认为数据库的所有实例是默认创建的service的首选节点。
手工创建的service资源区分首选节点与备用节点,客户端无论通过哪个节点请求连接都会固定连接到service资源的首选节点,只有当首选节点故障才会连接到备用节点。
TAF(Transparent Application Failover):对于已经连接到数据库的客户端连接(会话),当前连接的数据库实例出现问题时,将已经存在的数据库连接透明地迁移到其他数据库实例中。对应的连接可能在实例出现问题之前已经执行了一些操作,或者在实例出现问题时正在执行某个操作,所以在failover到新实例的时候需要对执行过的操作和正在执行的操作进行相应的处理。
TAF目前可以实现:
使用相同数据库用户在正常实例中创建一个会话。
在原有服务出现问题之前已经执行过的操作不会被重复执行。
对于正在执行的操作,如果是select语句,failover后会继续执行,但是对DML语句,会被自动回滚,用户需要重新执行。
如果用户执行了一些PL/SQL程序,和PL/SQL程序相关的信息在failover后也不会保留。
TAF的策略
basic:只与首选节点实例创建连接,在发生failover的时候才与备用节点实例创建连接。
preconnect:在与首选节点实例创建连接的同时与备用节点实例也创建连接。
TAF的类型
session:在failover发生后,新的连接被创建到正常实例,问题出现时正在运行的操作不会被继续执行。
select:在failover发生后,新的连接被创建到正常实例,问题出现时正在运行的select语句会被继续执行。
none:不会发生failover(禁用TAF)
TAF仅支持使用OCI方式连接到数据库的会话,不支持使用JDBC方式连接到数据库的会话。
创建Service资源
[root@linuxmi01 ~]# su - Oracle
[oracle@linuxmi01 ~]$ srvctl add service -d linuxmi -s zt -r linuxmi1 -a king2 -P basic -e session -w 5 -z 3 -y automatic
-d:数据库名称
-s:新创建的service名称
-r:首选节点列表
-a:备用节点列表
-P:TAF策略
-e:TAF类型
-z:在failover之前重新尝试连接的次数
-w:在failover之前两次尝试连接的时间间隔
-y:是否自动启动
查询Service资源属性
[oracle@linuxmi01 ~]$ srvctl config service -d linuxmi -s zt
Service name: zt
Service is enabled
Server pool: linuxmi_zt
Cardinality: 1
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Failover type: SESSION
Failover method: NONE
TAF failover retries: 3
TAF failover delay: 5
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: BASIC
Edition:
Preferred instances: linuxmi1
Available instances: linuxmi2
查询Service资源状态
[oracle@linuxmi01 ~]$ srvctl status service -d linuxmi
Service zt is not running.
启动Service资源
[oracle@linuxmi01 ~]$ srvctl start service -d linuxmi -s zt
[oracle@linuxmi01 ~]$ srvctl status service -d linuxmi
Service zt is running on instance(s) linuxmi1
验证TAF
查询GV$SESSION视图可以验证连接成功的会话是否具备failover的能力,如果会话相应的failover_type和failover_method字段为空,证明此会话不具备failover的能力。
[root@linuxmi01 ~]# su - oracle
[oracle@linuxmi01 ~]$ sqlplus / as sysdba
SQL> col username for a20
SQL> col failed_over for a15
SQL> select inst_id,username,failover_type,failover_method,failed_over from gv$session where username = 'TPCC';
INST_ID USERNAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- -------------------- --------------------------------------- ------------------------------ ---------------
1 TPCC SESSION BASIC NO
重启节点一,数据库连接failover到节点二
[root@linuxmi02 ~]# su - oracle
[oracle@linuxmi02 ~]$ sqlplus / as sysdba
SQL> select inst_id,username,failover_type,failover_method,failed_over from gv$session where username = 'TPCC';