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

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

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

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

我发现这篇文章的第二个最后的post暗示,因为我们正在使用命名的pipe道,当委托人离线,但我们在我们的连接string中强制TCP。

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

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

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

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

  1. 尝试与校长沟通,看看它不再是校长
  2. 与故障转移进行交stream,以确保故障已经结束,并且现在是新的委托人。

当委托人倒闭时,这个通信大约需要21秒,因为它会:

  1. 尝试与校长沟通,等待3秒,超时
  2. 尝试再次与校长沟通,等待6秒,超时
  3. 再次尝试与委托人沟通,等待12秒,超时
  4. 尝试与故障转移伙伴进行通信,查看它已经故障转移,因此在应用程序中进行故障转移。

所以如果你的sql连接没有等待21秒(实际上可能更多),那么在它完成这个跳舞之前它将超时,而且它根本不会进行故障切换。

解决方法是将连接string中的超时设置为较大的值,我们使用60秒来保证安全。

干杯

我想知道在testing时自动故障转移的条件是否得不到满足? 特别是 – 如果数据库在镜像失败时与镜像(从sys.database_mirroring检查镜像状态)不同步(如果证人和镜像在此时没有连接)(通过参与angular色之间的pingtesting)。

您也可能有一种情况,即您的合作伙伴和镜像之间没有互相连接 – 但合作伙伴和镜像数据库仍然独立与证人连接。 在这种情况下,证人看到没有错(因此没有故障转移)。 但是你提到你closures了服务器本身,所以这听起来不太可能。

还是你说故障转移最终发生,但你的重新连接失败? 在这种情况下,检测和故障切换时间根据主体如何失败以及恢复镜像数据库的总时间而有所不同。