当主体服务器物理脱机时,c# 中的数据库自动故障转移不起作用

use*_*521 10 windows sql sql-server-2008

我正在使用 SQL Server 2008 在 C# 中设置数据库自动故障转移,并且我使用见证设置具有“自动故障转移镜像的高安全性”,我的连接字符串看起来像

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

在测试期间,当我关闭主体服务器上的 SQL Server 服务时,自动故障转移就像一个魅力,但如果我使主体服务器脱机(通过关闭服务器或杀死网卡)自动故障转移不起作用并且我的网站只是超时。

我发现这篇文章的最后第二篇文章表明这​​是因为我们使用的命名管道在主体离线时不起作用,但我们在连接字符串中强制使用 TCP。

我错过了什么才能让这个数据库自动故障转移工作?

小智 7

在与 MS 合作一周后,我们已经弄清楚为什么会发生这种情况。

本质上,应用程序没有进行故障转移,因为它需要确保数据库已经故障转移 - 并且 sql 连接在连接确定数据库已故障转移之前超时。

确认数据库已故障转移(使用所有默认 tcp 注册表设置)的过程是:

  1. 尝试与校长沟通,看到它不再是校长
  2. 与故障转移进行通信以确保它已经故​​障转移并且它现在是新的主体。

当主体关闭时,此通信大约需要 21 秒,因为它将:

  1. 尝试与主体通信,等待 3 秒,超时
  2. 再次尝试与主体通信,等待 6 秒,超时
  3. 再次尝试与主体通信,等待 12 秒,超时
  4. 尝试与故障转移伙伴通信,看到它已故障转移,因此在应用程序中进行故障转移。

因此,如果您的 sql 连接没有等待 21 秒(实际上可能更多),那么它会在完成此舞蹈之前超时并且根本不会发生故障转移。

解决方案是将连接字符串中的超时设置为大值,为了安全起见,我们使用 60 秒。

干杯


小智 0

I\xe2\x80\x99m 想知道您测试时是否不满足自动故障转移的条件?具体来说 - 如果数据库在故障时未与镜像同步(从 sys.database_mirroring 检查镜像状态)和/或如果见证者和镜像当时未连接(通过参与角色之间的 ping 进行测试)。

\n\n

您还可能会遇到这样的情况:您的合作伙伴和镜像未相互连接 - 但合作伙伴和镜像数据库仍独立连接到见证服务器。在这种情况下,见证人认为没有任何问题(因此没有故障转移)。但你提到你关闭了服务器本身,所以这听起来不太可能。

\n\n

或者您是说故障转移最终发生但您的重新连接失败?在这种情况下,检测和故障转移时间取决于主体失败的方式以及恢复镜像数据库的总时间。

\n