右、
2つの答えと少し考えが答えに近づいて何かに私を得ました。
まずもう少し明確化:
アプリが(2.0+)C#で書かれており、SQL Server 2005の ミラーのセットアップは、プリンシパルとミラーをホストする2台のW2K3サーバであると話をするためにADO.NETを使用している
エクスプレス・インスタンスをモニターとしてホスティングする第3のサーバーがあります。これについての良い点は、データベースを使用してアプリケーションにフェイルオーバーがすべて透過的であることですが、一部の接続ではエラーが発生しますが、根本的にすべてがうまくいくということです。はい、私たちは奇妙な偽陽性を得ていますが、全体的なポイントは、システムが騒ぎと鏡の最小量で作業を続けさせることですはこれを非常にうまく提供します。
さらに、問題はサーバーの重大な障害ではありません。通常、これはもう少し明白ですが、他の理由でフェイルオーバーすると(上記の誤検出を参照)、さまざまなどのような場合でもフェイルオーバーを起こす状況を特定できるかどうかを確認することができます。
ので、上記の、単に箱の状態は非常に十分ではありません確認し、イベントログを追いかけ、おそらく過度に複雑である - それは結局のところ答えは、ある、かなりシンプル:
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!");
}
}
}
I a)は私に実際にが
を考えさせられた応答を取得)、その後、質問aとbを求めることなく、ここに到着していないだろう
Murph