适用于 SQL Server 的 OLE DB 驱动程序对高可用性和灾难恢复的支持

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 数据库

下载 OLE DB 驱动程序

本文介绍 OLE DB Driver for SQL Server 对 Always On 可用性组 的支持。 有关 Always On 可用性组的详细信息,请参阅可用性组侦听程序、客户端连接和应用程序故障转移 (SQL Server)、创建和配置可用性组 (SQL Server)、故障转移群集和 Always On 可用性组 (SQL Server) 和活动次要副本:可读次要副本(Always On 可用性组)。

您可以在连接字符串中指定给定可用性组的可用性组侦听器。 如果某一 OLE DB Driver for SQL Server 应用程序连接到进行故障转移的可用性组中的某个数据库,原始连接则将被断开,并且应用程序必须打开一个新的连接才能在故障转移后继续工作。

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

备注

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

连接MultiSubnetFailover

当目标对象是 Azure SQL 数据库、Azure SQL 托管实例、Microsoft Fabric 中的 SQL 数据库、Always On 可用性组监听器或 SQL Server 故障转移集群实例时,始终指定 MultiSubnetFailover=Yes。

当你的 连接字符串 中的服务器名称解析为多个 IP 地址时,MultiSubnetFailover=Yes 会告诉 OLE DB Driver for SQL Server 同时打开所有这些地址的连接,并使用第一个响应的地址。 没有它,驱动程序只能逐个尝试地址。 不响应的地址会卡顿,直到操作系统的 TCP 连接超时结束,这可能导致连接超时耗尽,驱动无法到达响应地址。 故障切换后,驱动程序首先尝试的地址可能已不再服务数据库,因此本可成功访问其他地址的连接会因超时而失败。

MultiSubnetFailover=是 ,改变客户端找到为数据库服务的副本的速度。 这并不改变服务器切换所需的时间。

MultiSubnetFailover=Yes 在单IP目标上是安全的。 当 DNS 解析到单一地址时,驱动会尝试一次连接,所以设置在不需要时不会产生任何费用。

有关连接字符串关键字的详细信息,请参阅将连接字符串关键字用于 OLE DB Driver for SQL Server。

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

  • 将 MultiSubnetFailover 连接属性设置为 “是”。

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

  • 你不能通过TCP以外的协议使用 多子网故障转移 。

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

  • 你不能用 MultiSubnetFaultover 配合数据库镜像。 当服务器报告数据库被镜像时,驱动程序会返回错误。 所有支持的 SQL Server 版本均已弃用数据库镜像。 请使用 Always On 可用性组来替代其他解决方案。

  • 认证类型——SQL Server认证、Kerberos认证或Windows认证——不会影响使用多子网故障转移连接属性的应用程序的行为。

  • 你可以提高 连接超时 值,以适应故障切换时间并减少应用连接重试次数。 默认值为 15 秒。 同样的设置在你通过 IDBInitialize::Initialize时会被命名为 Timeout,并且它映射到属性DBPROP_INIT_TIMEOUT。 对于启用自动暂停的 Azure SQL 数据库 无服务器,使用至少 60 秒的连接超时。 自动暂停的数据库在第一次连接尝试时恢复,而该尝试可能在数据库恢复时出现错误40613,因此应用程序必须重新尝试。 更多信息请参见 自动暂停和自动恢复。

  • 不支持分布式事务。

如果只读路由不起作用,那么在以下情况下将无法连接到可用性组中的次要副本位置:

  1. 如果未将辅助副本所在位置配置为接受连接。
  2. 如果应用程序使用 ApplicationIntent=ReadWrite ,且次级副本位置设置为只读访问。

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

从数据库镜像升级

如果连接字符串同时包含多子网故障转移和Failover_Partner关键词,就会发生连接错误。 如果你使用MultiSubnetFailover,而SQL Server返回故障切换伙伴响应,表示它是数据库镜像对的一部分,也会发生错误。

如果你将当前使用数据库镜像的OLE DB Driver for SQL Server应用升级为多子网场景,移除Failover_Partner连接属性,改为设置为“是”的多子网故障转移。 将连接字符串中的服务器名称替换为可用性组监听器。 如果连接字符串使用Failover_Partner且多子网故障切换=是,驱动程序将产生错误。 然而,如果连接字符串使用Failover_Partner且多子网故障转移=否(或应用意图=读写),应用则使用数据库镜像。

如果您在可用性组的主副本上使用数据库镜像,并且在连接到主副本而非可用性组监听器的连接字符串中使用MultiSubnetFailover=Yes,驱动程序会返回错误。

程序性地设置 MultiSubnetFailover

等效的连接属性为:

  • SSPROP_INIT_MULTISUBNETFAILOVER
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Server 应用程序可以使用以下方法之一来设置多子网故障转移选项:

  • IDBInitialize::Initialize
    使用之前配置的属性集初始化数据源并创建数据源对象。 将 MultiSubnetFailover 指定为提供者属性或扩展属性字符串的一部分。
  • IDataInitialize::GetDataSource
    接收一个输入连接字符串,该字符串可以包含MultiSubnetFaultover关键字。
  • IDBProperties::SetProperties
    要设置 MultiSubnetFailover 属性值,请调用 IDBProperties::SetProperties 传递 SSPROP_INIT_MULTISUBNETFAILOVER 属性,取值为 VARIANT_TRUE 或 VARIANT_FALSE,或 DBPROP_INIT_PROVIDERSTRING 属性,取值为 MultiSubnetFailover=Yes 或 MultiSubnetFailover=No。

示例

DBPROP rgPropMultisubnet;

rgPropMultisubnet.dwPropertyID = SSPROP_INIT_MULTISUBNETFAILOVER;
rgPropMultisubnet.dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropMultisubnet.dwStatus = DBPROPSTATUS_OK;
rgPropMultisubnet.colid = DB_NULLID;
V_VT(&(rgPropMultisubnet.vValue)) = VT_BOOL;
V_BOOL(&(rgPropMultisubnet.vValue)) = VARIANT_TRUE;

DBPROPSET PropSet;

PropSet.rgProperties = &rgPropMultisubnet;
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT;
IDBProperties* pIDBProperties = NULL;
hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
pIDBProperties->SetProperties(1, &PropSet);

指定应用程序意图

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

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

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

ReadOnly 的目标

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

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

  • 异地复制

  • 读取横向扩展

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

关键字 ApplicationIntent 启用只读路由。

只读路由

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

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

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

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

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

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

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

应用意图

OLE DB Driver for SQL Server 支持 ApplicationIntent 连接字符串 关键字。 有关连接字符串关键字的详细信息,请参阅将连接字符串关键字用于 OLE DB Driver for SQL Server。

编程设置 ApplicationIntent

等效的连接属性为:

  • SSPROP_INIT_APPLICATIONINTENT
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Server 应用程序可以使用以下方法之一来指定应用意图:

  • IDBInitialize::Initialize
    使用之前配置的属性集初始化数据源并创建数据源对象。 将应用程序意向指定为访问接口属性或作为扩展属性字符串的一部分。
  • IDataInitialize::GetDataSource
    取一个输入连接字符串,可以包含应用意图关键字。
  • IDBProperties::SetProperties
    要设置 ApplicationIntent 属性值,调用 IDBProperties::SetProperties ,输入 SSPROP_INIT_APPLICATIONINTENT 属性, ReadWrite 或 ReadOnly 值,或 DBPROP_INIT_PROVIDERSTRING 属性,包含 ApplicationIntent=ReadOnly 或 ApplicationIntent=ReadWrite。

你可以在 “全部 ”标签页中的数据 链接属性 对话框中的应用意图属性字段中指定应用意图。

当你建立隐式连接时,隐式连接会使用父连接的应用意图设置。 同样,从同一数据源创建的多个会话继承了数据源的应用意图设置。