0

当主数据库到辅助数据库发生故障时,JDBC 应用程序是否可以从 Oracle Data Guard 代理接收快速应用程序通知 (FAN) SWITCHOVER,以便应用程序可以在没有 Oracle RAC/集群的情况下重新连接?也就是说,我在主站点上有一个单实例数据库,在辅助站点上有一个类似的设置,我希望我的基于 Java 的应用程序在FAILOVER/的情况下检测并重新连接SWITCHOVER

根据我对 FAN 的了解,它依赖于 Oracle Notification Service,这间接意味着 Oracle RAC/Grid。这种理解正确吗?Oracle Data Guard 本身不需要 Oracle RAC 或 Oracle Grid。

如果 FAN 不可用,应用程序有哪些选项可以在无需重新启动的情况下连接到新的主节点?

4

1 回答 1

1

您需要 Oracle Grid 或 Oracle RAC。无法使用设置为单实例非 RAC 数据库的简单 Oracle Data Guard 进行配置。

客户端故障转移

对于客户端故障转移,我们需要考虑两件事:

  1. 检测数据库故障转移
  2. 重新连接新的主节点

检测数据库故障转移

FAN 主要帮助解决第一点。如果没有 FAN,应用程序将不得不依靠数据库连接错误来检测数据库是否出现故障(或不再是主数据库)。这可能以三种不同的方式发生:

  1. 在建立新连接时,应用程序将无法与失败的数据库连接。如果它是SWITCHOVER,应用程序也将无法使用(普通)Oracle Data Guard 与备用数据库建立连接。对于 Active Oracle Data Guard,除非它处于只读模式,否则它将无法打开连接。

  2. 已经从数据库端关闭的现有连接会引发错误。应用程序需要捕获此错误并做出相应的响应。

  3. 如果连接仍然有效(出于某种原因),并且数据库不再可用于响应(因为它已失败),则应用程序必须依赖 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)

于 2018-08-10T16:30:31.117 回答