具有 Oracle Data Guard 但不使用 Oracle Grid/RAC 的 Oracle FAN

Oracle FAN with Oracle Data Guard but without using Oracle Grid/ RAC

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

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

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

您需要 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 超时和 OS 套接字的级别处理。为此,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>))
))

来源:Client Failover Best Practices for Highly Available Oracle Databases (pdf)