SQL Server Native Client 对高可用性、灾难恢复的支持

本主题讨论 AlwaysOn 可用性组的 SQL Server Native Client 支持(在 SQL Server 2012 中添加)。 有关 AlwaysOn 可用性组的详细信息,请参阅可用性组侦听器、客户端连接和应用程序故障转移(SQL Server)可用性组(SQL Server)的创建和配置故障转移群集和 AlwaysOn 可用性组(SQL Server)活动辅助副本:可读次要副本(AlwaysOn 可用性组)。

可以在连接字符串中指定给定可用性组的可用性组侦听器。 如果 SQL Server Native Client 应用程序连接到故障转移的可用性组中的数据库,原始连接将中断,并且应用程序必须打开新连接才能在故障转移后继续工作。

如果不连接到可用性组侦听器,并且如果多个 IP 地址与主机名相关联,SQL Server Native Client 将按顺序循环访问与 DNS 条目关联的所有 IP 地址。 如果 DNS 服务器返回的第一个 IP 地址未绑定到任何网络接口卡 (NIC),则上述遍历操作可能会用时较长。 连接到可用性组侦听器时,SQL Server Native Client 会尝试并行建立与所有 IP 地址的连接,如果连接尝试成功,驱动程序将放弃任何挂起的连接尝试。

注释

增大连接超时值和实现连接重试逻辑将增加应用程序连接到可用性组的概率。 此外,由于可用性组进行故障转移而可能使连接失败,您应实现连接重试逻辑,重试失败的连接,直至重新连接。

使用 MultiSubnetFailover 进行连接

在连接到 SQL Server 2012 可用性组侦听器或 SQL Server 2012 故障转移群集实例时,应始终指定 MultiSubnetFailover=YesMultiSubnetFailover 为 SQL Server 2012 中的所有可用性组和故障转移群集实例启用更快的故障转移,并显著缩短单子网和多子网 AlwaysOn 拓扑的故障转移时间。 在多子网故障转移过程中,客户端将尝试并行进行连接。 在子网故障转移期间,SQL Server Native Client 会主动重试 TCP 连接。

MultiSubnetFailover连接属性指示应用程序正在可用性组或故障转移群集实例中部署,并且 SQL Server Native Client 将尝试通过尝试连接到所有 IP 地址来连接到主 SQL Server 实例上的数据库。 为连接指定 MultiSubnetFailover=Yes 后,客户端将在比操作系统的默认 TCP 重传间隔更短的时间内重试 TCP 连接尝试。 这样就可以在 AlwaysOn 可用性组或 AlwaysOn 故障转移群集实例的故障转移后更快地重新连接,并适用于单子网和多子网可用性组和故障转移群集实例。

有关连接字符串关键字的详细信息,请参阅 将连接字符串关键字与 SQL Server Native Client 配合使用

指定 MultiSubnetFailover=Yes 何时连接到可用性组侦听器或故障转移群集实例以外的内容可能会导致负面影响,并且不受支持。

使用以下准则可以连接到可用性组或故障转移群集实例中的服务器:

  • 在连接到单子网或多子网时使用 MultiSubnetFailover 连接属性;这将改进这两者的性能。

  • 若要连接到某一可用性组,请在您的连接字符串中将该可用性组的可用性组侦听器指定为服务器。

  • 连接到配置有超过 64 个 IP 地址的 SQL Server 实例将导致连接失败。

  • 基于以下身份验证类型,使用 MultiSubnetFailover 连接属性的应用程序的行为将不会受到影响:SQL Server 身份验证、Kerberos 身份验证或 Windows 身份验证。

  • 可以增加故障转移时间以适应的值 loginTimeout ,并减少应用程序连接重试尝试。

  • 不支持分布式事务。

如果只读路由无效,则连接到可用性组中的辅助副本位置在以下情况下会失败:

  1. 如果未将辅助副本位置配置为接受连接。

  2. 如果应用程序使用 ApplicationIntent=ReadWrite(在下面论述)且将辅助副本位置配置为只读访问。

如果将主副本配置为拒绝只读工作负荷且连接字符串包含 ApplicationIntent=ReadOnly,连接将失败。

升级以便使用来自数据库镜像的多子网群集

如果 MultiSubnetFailover 连接字符串中存在连接关键字和 Failover_Partner 连接关键字,则会发生连接错误。 如果使用 MultiSubnetFailover ,SQL Server 还会返回故障转移伙伴响应,指示它是数据库镜像对的一部分。

如果升级当前使用数据库镜像到多子网方案的 SQL Server Native Client 应用程序,则应删除 Failover_Partner 连接属性,并将其 MultiSubnetFailover 替换为连接字符串 Yes 中的服务器名称,并将其替换为可用性组侦听器。 如果连接字符串使用 Failover_PartnerMultiSubnetFailover=Yes,则驱动程序将生成错误。 但是,如果连接字符串使用 Failover_PartnerMultiSubnetFailover=No(或 ApplicationIntent=ReadWrite),则应用程序将使用数据库镜像。

如果在可用性组中的主数据库上使用数据库镜像,并在 MultiSubnetFailover=Yes 连接到主数据库的连接字符串中使用,而不是连接到可用性组侦听器的连接字符串中,驱动程序将返回错误。

指定应用程序意向

ApplicationIntent=ReadOnly客户端连接到启用了 AlwaysOn 的数据库时请求读取工作负荷。 服务器在连接时和在执行 USE 数据库语句的过程中将强制该意向,但仅针对启用了 AlwaysOn 的数据库。

ApplicationIntent 关键字不适用于早期的只读数据库。

数据库可以允许或禁止对目标 AlwaysOn 数据库的读取工作负荷。 (这是通过 ALLOW_CONNECTIONSPRIMARY_ROLETransact-SQL 语句的 SECONDARY_ROLE 子句实现的。)

ApplicationIntent 关键字用于启用只读路由。

只读路由

只读路由是一项可确保数据库只读副本的可用性的功能。 启用只读路由:

  1. 您必须连接到某一 AlwaysOn 可用性组侦听器。

  2. ApplicationIntent 连接字符串关键字必须设置为 ReadOnly

  3. 数据库管理员必须配置该可用性组以便启用只读路由。

使用只读路由的多个连接可能不会全部连接到相同的只读副本。 对数据库同步进行更改或对服务器的路由配置进行更改可能导致客户端连接到不同的只读副本。 若要确保所有只读请求都连接到相同的只读副本,请勿将可用性组侦听器传递到 Server 连接字符串关键字。 而是指定只读实例的名称。

只读路由所用的时间可能会长于连接到主副本的时间,因为只读路由首先连接到主副本,然后查找可用的最佳可读取辅助副本。 为此,应增加您的登录超时。

ODBC

添加了两个 ODBC 连接字符串关键字以支持 SQL Server Native Client 中的 AlwaysOn 可用性组:

  • ApplicationIntent

  • MultiSubnetFailover

有关 SQL Server Native Client 中的 ODBC 连接字符串关键字的详细信息,请参阅 将连接字符串关键字与 SQL Server Native Client 配合使用

等效的连接属性包括:

  • SQL_COPT_SS_APPLICATION_INTENT

  • SQL_COPT_SS_MULTISUBNET_FAILOVER

有关 SQL Server Native Client 中的 ODBC 连接属性的详细信息,请参阅 SQLSetConnectAttr

从 SQL Server 2012 开始,SQL Server Native Client 驱动程序的 ODBC 数据源管理员中将公开该和MultiSubnetFailover关键字的功能ApplicationIntent

SQL Server Native Client ODBC 应用程序可以使用以下三个函数之一建立连接:

功能 DESCRIPTION
SQLBrowseConnect 返回 SQLBrowseConnect 的服务器列表不包括 VNN。 只有在服务器是独立服务器或 Windows Server 故障转移群集(WSFC)群集中的主服务器或辅助服务器时,才会看到服务器列表,其中包含为 AlwaysOn 可用性组启用的两个或多个 SQL Server 实例。 如果连接到服务器并发生故障,可能是因为你已连接到服务器,并且 ApplicationIntent 该设置与服务器配置不兼容。

由于 SQLBrowseConnect 无法识别 Windows Server 故障转移群集(WSFC)群集中的服务器,该群集包含为 AlwaysOn 可用性组启用的两个或多个 SQL Server 实例, SQLBrowseConnect 因此忽略 MultiSubnetFailover 连接字符串关键字。
SQLConnect SQLConnect ApplicationIntent同时支持数据源MultiSubnetFailover名称(DSN)或连接属性。
SQLDriverConnect SQLDriverConnect 支持 ApplicationIntentMultiSubnetFailover 通过连接字符串关键字、连接属性或 DSN。

OLE DB

SQL Server Native Client 中的 OLE DB 不支持关键字 MultiSubnetFailover

SQL Server Native Client 中的 OLE DB 将支持应用程序意向。 应用程序意向对于 OLE DB 应用程序的行为与 ODBC 应用程序相同(请参阅上文)。

添加了一个 OLE DB 连接字符串关键字以支持 SQL Server Native Client 中的 AlwaysOn 可用性组:

  • Application Intent

有关 SQL Server Native Client 中的连接字符串关键字的详细信息,请参阅 将连接字符串关键字与 SQL Server Native Client 配合使用

等效的连接属性包括:

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

SQL Server Native Client OLE DB 应用程序可以使用其中一种方法来指定应用程序意向:

IDBInitialize::Initialize
IDBInitialize::Initialize 使用以前配置的属性集初始化数据源并创建数据源对象。 将应用程序意向指定为提供程序属性或扩展属性字符串的一部分。

IDataInitialize::GetDataSource
IDataInitialize::GetDataSource 采用可包含关键字的 Application Intent 输入连接字符串。

IDBProperties::GetProperties
IDBProperties::GetProperties 检索当前在数据源上设置的属性的值。 可以通过DBPROP_INIT_PROVIDERSTRING属性和SSPROP_INIT_APPLICATIONINTENT属性检索 Application Intent 值。

IDBProperties::SetProperties
若要设置 ApplicationIntent 属性值,请调用 IDBProperties::SetProperties 传入 SSPROP_INIT_APPLICATIONINTENT 值为“ReadWrite”或“”“ReadOnly的属性,或 DBPROP_INIT_PROVIDERSTRING 包含”ApplicationIntent=ReadOnly“或”“ApplicationIntent=ReadWrite的值的属性。

可以在“ 数据链接属性 ”对话框中“所有”选项卡的“应用程序意向属性”字段中指定应用程序意向。

建立隐式连接后,隐式连接将使用父连接的应用程序意向设置。 同样,从同一数据源创建的多个会话将继承数据源的应用程序意向设置。

另请参阅

SQL Server Native Client 功能
将连接字符串关键字用于 SQL Server 本机客户端