SQL Server 数据库镜像:故障转移时奇怪的客户端应用程序行为

Ale*_*tap 7 sql-server mirroring sql-server-2008-r2 high-availability

我正在建立一个基于三台 SQL Server 2008 R2 机器和数据库镜像的 HA SQL 服务器环境。

我会命名它们:

  • 委托人.company.intra
  • mirror.company.intra
  • 证人.company.intra

“company.intra”域是控股公司的域。

两个数据库引擎都在侦听静态 52002 端口,因此客户端应用程序可以通过以下方式访问它们:

principal.company.intra,52002 & mirror.company.intra,52002
Run Code Online (Sandbox Code Playgroud)

端点EP_Mirroring在主体和镜像、EP_Witness见证和侦听主体的 5022 端口、镜像的 5023 和见证的 5024 端口上调用。

服务帐户已正确配置并被授予对彼此端点的连接权限。

镜像功能工作正常,并且在 TSQL 手动故障转移或模拟系统故障的情况下,数据库可以正确进行故障转移。

问题在于应用程序在故障转移时行为异常。

应用程序测试上下文如下:

一个包含两个文本框和一个按钮的小型 .NET 应用程序:

单击按钮时,它会进行存储过程调用,并使用 sp 的输出填充 Textbox1,使用 my 的数据源属性填充 Textbox2 SqlConnection

连接字符串如下所示:

Data source=principal.company.intra,52002;failover partner=mirror.company.intra,52002;
initial catalog = TEST_FAILOVER;user ID=user;password=pass;Connection Timeout=30
Run Code Online (Sandbox Code Playgroud)

我从我的笔记本电脑启动了这个应用程序,位于另一个域: laptop.childcompany.com

场景一

  1. 我启动应用程序
  2. 按下按钮,TB1:sp 输出/TB2:principal.company.intra,52002
  3. 数据库故障转移
  4. 按钮按下,连接超时
  5. 按钮按下,连接超时
  6. 镜像中的数据库故障转移(返回主体)
  7. 按下按钮,TB1:sp 输出/TB2:principal.company.intra,52002

场景二

  1. 数据库故障转移
  2. 启动应用程序
  3. 按下按钮,TB1:sp 输出/TB2:mirror.company.intra,52002
  4. 镜像中的数据库故障转移(回到主体)
  5. 按下按钮,连接错误
  6. 按下按钮,TB1:sp 输出/TB2:principal.company.intra,52002
  7. 数据库故障转移
  8. 按钮按下,连接超时
  9. 按钮按下,连接超时

然后我尝试通过 RDP 在本地启动镜像服务器上的应用程序

场景3

  1. 启动应用程序
  2. 按下按钮,TB1:sp 输出/TB2:principal.company.intra,52002
  3. 数据库故障转移
  4. 按下按钮,连接错误
  5. 按下按钮,TB1:sp 输出/TB2:MIRROR

我检查了 MSDN 的 Ole DB 连接行为以了解故障转移时为什么在第三种情况下我的连接的数据源属性设置为MIRROR而不是mirror.company.holding,52002

我了解到我的连接字符串的故障转移服务器属性仅在与主体的初始连接失败的情况下使用(解释了为什么场景 2 正确工作),但在现有连接的情况下,主体服务器已经提供具有镜像服务器地址的应用程序(称为“故障转移缓存”);提供的信息是错误的,没有侦听端口信息和主机名而不是 FQDN,因此在控股公司域之外失败。

下一步,我检查了 sys.database_mirroring 视图:

select M.* 
from sys.databases D 
inner join sys.database_mirroring M on D.database_id = M.database_id 
where D.name = 'TEST_FAILOVER'
Run Code Online (Sandbox Code Playgroud)

并注意到“mirroring_partner_instance”字段包含“MIRROR”而不是“mirror.company.intra,52002”。

对 Books Online 的快速检查告诉我,这是用于在初始连接到主体数据库引擎时通知客户端应用程序故障转移合作伙伴的字段。

所以,最后,我的问题是:

有没有办法纠正这种行为,并使“mirroring_partner_instance”字段包含镜像的 FQDN 和侦听端口?

在端点创建时?在镜像配置级别(通过alter database 语句)?数据库引擎配置?

我已经成功尝试在客户端计算机上设置 SQL Server Native 客户端别名作为解决方法,但是我真的更喜欢主体服务器向客户端应用程序返回正确的故障转移信息。

小智 1

建议您检查每个框是否为每个目标/sql-srv 以及见证 FQDN 注册了端口等的每个 FQDN。每台服务器都已使用 FQDN 注册了所有三个服务器。重新初始化端点并祈祷吧!:) 如果在 DMZ 中,您可以在 DMZ 中使用 AD 吗?或者也许对公司 AD 有信任?如果注册了短名称和 FQDN,则认为这种信任可能会让您感到不舒服,因此会使用非 FQDN。瑞克