您需要 Oracle Grid 或 Oracle RAC。无法使用设置为单实例非 RAC 数据库的简单 Oracle Data Guard 进行配置。
客户端故障转移
对于客户端故障转移,我们需要考虑两件事:
- 检测数据库故障转移
- 重新连接新的主节点
检测数据库故障转移
FAN 主要帮助解决第一点。如果没有 FAN,应用程序将不得不依靠数据库连接错误来检测数据库是否出现故障(或不再是主数据库)。这可能以三种不同的方式发生:
在建立新连接时,应用程序将无法与失败的数据库连接。如果它是SWITCHOVER
,应用程序也将无法使用(普通)Oracle Data Guard 与备用数据库建立连接。对于 Active Oracle Data Guard,除非它处于只读模式,否则它将无法打开连接。
已经从数据库端关闭的现有连接会引发错误。应用程序需要捕获此错误并做出相应的响应。
如果连接仍然有效(出于某种原因),并且数据库不再可用于响应(因为它已失败),则应用程序必须依赖 TCP/IP 超时和操作系统级别的套接字处理。为此,Oracle 建议您在内核级别调整超时。
一旦检测到连接失败,您的应用程序应该能够创建到数据库的新连接。应该与新的主节点建立此连接,如下所述。
重新连接新的主节点
无论您是否使用 FAN,您都可以在连接字符串中指定地址列表(而不是单个数据库)。这允许您对多个数据库使用单个连接字符串,并且还可以帮助您处理 Oracle Data Guard 故障转移方案。下面给出了具有多个地址的 JDBC 连接字符串示例:
jdbc:oracle:thin:<userid>/<pwd>@(DESCRIPTION_LIST=
(LOAD_BALANCE=off)(FAILOVER=on)
(DESCRIPTION=
(CONNECT_TIMEOUT=6)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=2)
(ADDRESS_LIST=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=<primary-host-name>)(PORT=<port>))
)
(CONNECT_DATA=(SERVICE_NAME=<dbServiceNameOnPrimary>))
)
(DESCRIPTION=
(CONNECT_TIMEOUT=6)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=2)
(ADDRESS_LIST=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=<standby-host-name>)(PORT=<port>))
)
(CONNECT_DATA=(SERVICE_NAME=<dbServiceNameOnStandby>))
))
来源:高可用性 Oracle 数据库的客户端故障转移最佳实践(pdf)