右鍵,
兩個答案,多花點心思讓我的東西接近的答案。
一是多一點澄清:
的應用程序是用C#(2.0+),並使用ADO.NET交談到SQL Server 2005 鏡像設置是承載主體和鏡像兩個W2K3服務器加上第三臺服務器作爲顯示器託管一個快速實例。關於這一點的好處是故障轉移對於使用數據庫的應用程序來說都是透明的,它會爲某些連接拋出一個錯誤,但從根本上來說,一切都會很好地進行。是的,我們得到了奇怪的誤報,但重點在於讓系統繼續以最少的次數進行工作,並且鏡像確實提供了非常好的結果。
此外,這個問題並不是嚴重的服務器故障 - 通常有點更明顯,但有其他原因的故障轉移(參見上面的誤判),因爲我們確實有一些事情不能,對於各種原因,故障轉移,無論如何我們可以看到我們是否能夠識別出我們得到誤報的情況。
因此,考慮到箱子的上面,只需檢查狀態是不是很夠,並通過事件日誌追逐可能是過於複雜的 - 答案是,事實證明,相當簡單:sp_helpserver將
的由sp_helpserver返回的第一列是服務器名稱。如果您定期運行請求,則會保存以前的服務器名稱,並且每次您都可以識別發生更改的時間並進行比較,然後採取適當的措施。
以下是一個控制檯應用程序,它演示了委託人 - 雖然它需要一些工作(例如連接應該是非集中的並且每次都是新的),但現在已足夠了(所以我會接受它作爲「 「答案」)。參數是校長,鏡,數據庫
using System;
using System.Data.SqlClient;
namespace FailoverMonitorConcept
{
class Program
{
static void Main(string[] args)
{
string server = args[0];
string failover = args[1];
string database = args[2];
string connStr = string.Format("Integrated Security=SSPI;Persist Security Info=True;Data Source={0};Failover Partner={1};Packet Size=4096;Initial Catalog={2}", server, failover, database);
string sql = "EXEC sp_helpserver";
SqlConnection dc = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, dc);
Console.WriteLine("Connection string: " + connStr);
Console.WriteLine("Press any key to test, press q to quit");
string priorServerName = "";
char key = ' ';
while(key.ToString().ToLower() != "q")
{
dc.Open();
try
{
string serverName = cmd.ExecuteScalar() as string;
Console.WriteLine(DateTime.Now.ToLongTimeString() + " - Server name: " + serverName);
if (priorServerName == "")
{
priorServerName = serverName;
}
else if (priorServerName != serverName)
{
Console.WriteLine("***** SERVER CHANGED *****");
Console.WriteLine("New server: " + serverName);
priorServerName = serverName;
}
}
catch (System.Data.SqlClient.SqlException ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
finally
{
dc.Close();
}
key = Console.ReadKey(true).KeyChar;
}
Console.WriteLine("Finis!");
}
}
}
我就不會來到這裏沒有)提出的問題,然後b)獲得這讓我真正認爲
響應
Murph