建立到数据库镜像会话的初始连接

对于到镜像数据库的初始连接,客户端必须提供一个至少提供服务器实例名称的连接字符串。这个必需的服务器名称应标识当前主体服务器实例,并称为“初始伙伴名称”。

另外,连接字符串还可以提供另一个服务器实例的名称,此名称应标识当前镜像服务器实例,以便在首次连接尝试期间初始伙伴不可用的情况下使用。第二个名称称为“故障转移伙伴名称”。

连接字符串还必须提供数据库名称。这是数据访问接口启用故障转移尝试所必需的。

接收连接字符串后,数据访问接口将初始伙伴名称和故障转移伙伴名称(如果提供)存储在客户端易失内存的缓存中(对于托管代码,缓存的作用域限定为应用程序域)。缓存后,数据访问接口将从不对初始伙伴名称进行更新。客户端提供故障转移伙伴名称时,数据访问接口还暂时存储此故障转移伙伴名称,以防出现访问接口无法使用初始伙伴名称进行连接的情况。

数据库镜像会话无法避免与客户端相关的服务器访问问题,例如,客户端计算机出现网络通信问题时。到镜像数据库的连接尝试也可能会因为各种与数据访问接口无关的原因而失败;例如,连接尝试可能会因为下列情况而失败:主体服务器实例处于不活动状态(如同数据库进行故障转移时发生的情况)或者网络错误。

尝试连接时,数据访问接口首先使用初始伙伴名称。如果指定的服务器实例可用并且为当前主体服务器实例,则连接尝试通常都会成功。

注意注意

如果镜像会话暂停,则客户端通常连接到主体服务器并下载伙伴名称。但是,在恢复镜像之前,数据库不可用于客户端。

如果此尝试失败,则数据访问接口将尝试使用故障转移伙伴名称(如果可用)。如果任一伙伴名称都正确标识了当前主体服务器,则数据访问接口通常都会成功打开初始连接。完成此连接后,数据访问接口将下载当前镜像服务器的服务器实例名称。此名称作为故障转移伙伴名称存储在缓存中,从而覆盖客户端提供的故障转移伙伴名称(如果有)。此后,.NET Framework Data Provider for SQL Server 不会更新故障转移伙伴名称。相反,每当后续连接或连接重置返回不同的伙伴名称时,SQL Server Native Client 便会更新高速缓存。

下图针对名为 Db_1 的镜像数据库说明了到初始伙伴 Partner_A 的客户端连接。此图显示的情况是:客户端提供的初始伙伴名称正确标识了当前主体服务器 Partner_A。初始连接尝试成功,数据访问接口在其本地缓存中将镜像服务器(当前为 Partner_B)的名称存储为故障转移伙伴名称。最后,客户端连接到 Db_1 数据库的主体副本。

初始伙伴为主体的客户端连接

初始连接尝试可能会失败,例如,因为网络错误或不活动的服务器实例。由于初始伙伴不可用,因此要让数据访问接口尝试连接到故障转移伙伴,客户端必须在连接字符串中提供故障转移伙伴的名称。

在这种情况下,如果故障转移伙伴名称不可用,则原始连接尝试将继续,直到网络连接超时或返回错误(与非镜像数据库的情况相同)。

连接字符串中提供故障转移伙伴名称时,数据访问接口的行为取决于网络协议和客户端的操作系统,如下所示:

  • 对于 TCP/IP,如果客户端运行的是 Microsoft Windows XP 或更高版本,则使用与数据库镜像相关的连接重试算法调整连接尝试。“连接重试算法”确定在给定连接尝试中为打开连接所分配的最长时间(“重试时间”)。有关详细信息,请参阅将连接字符串关键字用于 SQL Server Native Client

  • 对于其他网络协议以及未运行 Microsoft Windows XP 或更高版本的客户端

    如果发生错误或者初始伙伴不可用,则初始连接尝试将处于等待状态,直到数据访问接口上的网络连接超时期限过期或登录超时期限过期。通常,此等待时间大约为 20 至 30 秒。此后,如果数据访问接口尚未超时,则它会尝试连接到故障转移伙伴。如果连接超时期限过期而未成功连接或者故障转移伙伴不可用,则连接尝试会失败。如果故障转移伙伴在登录超时期限内可用并且现在为主体服务器,则连接尝试通常都会成功。

镜像数据库的连接字符串

客户端提供的连接字符串包含数据访问接口用于连接到数据库的信息。本部分介绍了与使用 SQL Server Native Client ODBC 驱动程序连接连接到镜像数据库特定相关的关键字。有关所有连接字符串关键字的信息,请参阅 将连接字符串关键字用于 SQL Server Native Client

Network 属性

连接字符串应包含 Network 属性以指定网络协议。这可确保到不同伙伴的连接之间存在指定的网络协议。连接到镜像数据库的最佳协议是 TCP/IP。为了确保客户端针对每个到伙伴的连接都请求 TCP/IP,连接字符串提供以下属性:

Network=dbmssocn; 
重要说明重要提示

建议将 TCP/IP 始终放在客户端协议列表的顶部。但是,如果连接字符串指定 Network 属性,则此属性会弄乱列表顺序。

另外,为了确保客户端针对每个到伙伴的连接都请求 Named Pipes,连接字符串提供以下属性:

Network=dbnmpntw; 
重要说明重要提示

由于 Named Pipes 不使用 TCP/IP 重试算法,因此在很多情况下,Named Pipes 连接尝试可能会在连接到镜像数据库之前超时。

Server 属性

连接字符串必须包含 Server 属性以提供初始伙伴名称,该名称应标识当前主体服务器实例。

标识服务器实例的最简单方法就是通过指定其名称 <服务器名>[\<SQL Server 实例名>] 进行标识。例如:

Server=Partner_A;

或者

Server=Partner_A\Instance_2;

但是,使用系统名称时,客户端必须执行 DNS 查找以获取服务器的 IP 地址,执行 SQL Server Browser 查询以获取伙伴所在服务器的端口号。通过在 Server 属性中指定伙伴的 IP 地址和端口号而不是指定服务器名称,可以跳过这些查找和查询。建议跳过这些查找和查询,以最大程度地降低连接到此伙伴时出现外部延迟的几率。

注意注意

如果连接字符串指定命名实例的名称而不是端口,则 SQL Server Browser 查询是必需的。

若要指定 IP 地址和端口,Server 属性采用的格式为 Server=<IP 地址>,<端口>,例如:

Server=123.34.45.56,4724; 
注意注意

IP 地址可以是 IP 版本 4 (IPv4) 或 IP 版本 6 (IPv6)。

Database 属性

此外,连接字符串还必须指定 Database 属性以提供镜像数据库的名称。如果客户端尝试连接时指定的数据库不可用,将引发异常。

例如,若要明确连接到主体服务器 Partner_A 上的 AdventureWorks 数据库,客户端应使用以下连接字符串:

" Server=Partner_A; Database=AdventureWorks "

注意注意

此字符串未包含身份验证信息。有关集成身份验证关键字的信息,请参阅将连接字符串关键字用于 SQL Server Native Client

重要说明重要提示

如果将协议前缀和 Server 属性绑定在一起 (Server=tcp:<servername>),则会与 Network 属性不兼容;如果在这两个位置都指定了协议,则可能会导致错误。因此,建议连接字符串使用 Network 属性指定协议,并且仅在 Server 属性中指定服务器名称 ("Network=dbmssocn; Server=<服务器名>")。

Failover Partner 属性

除了初始伙伴名称以外,客户端还可以指定应标识当前镜像服务器实例的故障转移伙伴名称。故障转移伙伴是由 failover partner 属性的某个关键字指定的。具体由该属性的哪个关键字指定取决于您所使用的 API。下表列出了这些关键字:

API

failover partner 属性的关键字

OLE DB 访问接口

FailoverPartner

ODBC 驱动程序

Failover_Partner

ActiveX 数据对象 (ADO)

Failover Partner

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

标识服务器实例的最简单方法是通过其系统名称 <服务器名>[\<SQL Server 实例名>] 进行标识。

另外,还可以在 Failover Partner 属性中提供 IP 地址和端口号。如果首次连接到数据库时初始连接尝试失败,则到故障转移伙伴的连接尝试将不会依赖于 DNS 和 SQL Server Browser。建立连接后,便会使用故障转移伙伴名称覆盖故障转移伙伴名称,因此,如果发生故障转移,则重定向的连接将需要 DNS 和 SQL Server Browser。

注意注意

如果仅提供了初始伙伴名称,则应用程序开发人员不需要执行任何操作,也不需要编写除了有关如何重新连接的代码之外的任何代码。

注意注意

托管代码应用程序开发人员在 SqlConnection 对象的 ConnectionString 中提供故障转移伙伴名称。有关使用此连接字符串的信息,请参阅 ADO.NET 文档(Microsoft .NET Framework SDK 中包含此文档)中的“Database Mirroring Support in the .NET Framework Data Provider for SQL Server”。

连接字符串示例

例如,为了使用 TCP/IP 显式连接到 Partner_A 或 Partner_B 上的 AdventureWorks 数据库,使用 ODBC 驱动程序的客户端应用程序可能会提供以下连接字符串:

"Server=Partner_A; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"

另外,客户端还可以使用 IP 地址和端口号标识初始伙伴 Partner_A;例如,如果 IP 地址为 250.65.43.21,端口号为 4734,则连接字符串将为:

"Server=250.65.43.21,4734; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"