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

适用于:yesSQL Server (所有受支持的版本) Yes Azure SQL 数据库 azure SQL yes 托管实例 azure Synapse analytics yes 分析平台 Yes 系统 (PDW)

本主题讨论) ) 的 SQL Server 2012 (SQL Server Native Client 支持 (添加的支持。 有关 Always On 可用性组的详细信息,请参阅可用性组侦听器、客户端连接和应用程序故障转移 (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 中的所有可用性组和故障转移群集实例启用更快的故障转移,并且将显著缩短单个和多子网 Always On 拓扑的故障转移时间。 在多子网故障转移过程中,客户端将尝试并行进行连接。 在子网故障转移期间,SQL Server Native Client 会主动重试 TCP 连接。

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

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

如果在连接到非可用性组侦听程序或非故障转移群集实例时指定了 MultiSubnetFailover=Yes,可能会对性能造成负面影响,因此不支持这样做。

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

  • 连接到单子网或多子网时使用 MultiSubnetFailover 连接属性,这二者的性能都会得到改进。

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

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

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

  • 你可以增加 loginTimeout 的值,以延长故障转移时间并减少应用程序连接重试次数。

  • 不支持分布式事务。

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

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

  2. 如果应用程序使用 ApplicationIntent=ReadWrite(在下文中介绍)且将次要副本位置配置为只读访问。

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

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

如果连接字符串中已存在 MultiSubnetFailoverFailover_Partner 连接关键字,将出现连接错误。 如果使用的是 MultiSubnetFailover,且 SQL Server 返回指明它属于数据库镜像对的故障转移伙伴响应,也会导致错误抛出。

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

如果数据库镜像用于可用性组中的主数据库,并且 MultiSubnetFailover=Yes 用于连接到主数据库(而非连接到可用性组侦听程序)的连接字符串中,则驱动程序将返回错误。

指定应用程序意图

你可以在连接字符串中指定 ApplicationIntent 关键字。 可分配的值为 ReadWrite(默认值)或 ReadOnly

当你设置 ApplicationIntent=ReadOnly 时,客户端将在连接时请求读取工作负荷。 服务器在连接时和在执行 USE 数据库语句期间强制执行此意图。

ApplicationIntent 关键字不适用于旧版只读数据库。

ReadOnly 的目标

如果连接选择 ReadOnly,连接就会分配到数据库可能存在的下列任何特殊配置:

  • AlwaysOn。 数据库可允许或禁止目标 Always On 数据库上的读取工作负载。 此选项通过使用 PRIMARY_ROLESECONDARY_ROLE Transact-SQL 语句的 ALLOW_CONNECTIONS 子句进行控制。

  • 异地复制

  • 读取横向扩展

如果这些特殊目标都不可用,则从常规数据库读取。

ApplicationIntent关键字启用ApplicationIntent

只读路由

只读路由是一项功能,可用于确保数据库的只读副本的可用性。 若要启用只读路由,必须遵守以下所有要求:

  • 必须连接到 AlwaysOn 可用性组侦听程序。

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

  • 数据库管理员必须配置可用性组才能启用只读路由。

使用只读路由的多个连接可能不会全部连接到相同的只读副本。 对数据库同步进行更改或对服务器的路由配置进行更改可能导致客户端连接到不同的只读副本。

通过 将可用性组侦听器传递到 连接字符串关键字,可以确保所有只读请求都连接到相同的只读副本。 而是指定只读实例的名称。

只读路由可能比连接到主要副本需要更长的时间。 等待时间较长是因为只读路由首先会连接到主要副本,然后查找最合适的可读次要副本。 由于需要执行多个步骤,所以应将 login 超时时间增加到至少 30 秒。

ODBC

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

  • 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

ApplicationIntentMultiSubnetFailover关键字的功能将在使用 SQL Server Native Client 驱动程序的 dsn 的 ODBC 数据源管理器中公开,从 SQL Server 2012 (11. x) 开始。

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

函数 描述
SQLBrowseConnect SQLBrowseConnect 返回的服务器列表将不包括 VNN。 如果服务器是独立服务器或 Windows server 故障转移群集中的主服务器或辅助服务器 (WSFC) 群集包含为 Always On 可用性组启用的两个或更多 SQL Server 实例,则将仅显示服务器列表,而无需任何指示。 如果连接到服务器失败,可能是因为你已连接到某服务器而 ApplicationIntent 设置与该服务器配置不兼容。

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

OLE DB

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

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

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

  • 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 属性值,请调用在带有“ReadWrite”或“ReadOnly”值的 SSPROP_INIT_APPLICATIONINTENT 属性或含有“ApplicationIntent=ReadOnly”或“ApplicationIntent=ReadWrite”值的 DBPROP_INIT_PROVIDERSTRING 属性中传递的 IDBProperties::SetProperties

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

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

另请参阅

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