Service 资源
每个数据库都有一个或多个 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';
- INST_ID USERNAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
- ---------- -------------------- --------------------------------------- ------------------------------ ---------------
- 2 TPCC SESSION BASIC YES
来源: http://www.linuxidc.com/Linux/2018-08/153688.htm