Language

SQL Server のデータベース ミラーリング

SQL Serverのデータベース ミラーリングを使用すると、SQL Server データベースのコピー (ミラー) をスタンバイ サーバーに保持できます。 ミラーリングは、常にデータのコピーが 2 つ別々に存在することを保証し、高可用性とデータの完全な冗長性をもたらします。 SQL Server データベースのデータベース ミラーリングを構成すると、Microsoft.Data.SqlClient では追加のクライアント コードなしでそれがサポートされます。 ConnectionString プロパティでフェールオーバー パートナー サーバーを指定することもできます。

次の一連のイベントは、 SqlConnection オブジェクトがミラーリング用に構成されたデータベースを対象とする場合に発生します。

  1. クライアント アプリケーションがプリンシパル データベースに正常に接続し、サーバーがパートナー サーバーの名前を送り返します。その後、その名前がクライアントでキャッシュされます。

  2. プリンシパル データベースを含むサーバーに障害が発生、または接続が中断された場合、接続およびトランザクション状態は失われます。 クライアント アプリケーションがプリンシパル データベースへの接続を再確立しようとして失敗します。

  3. 次に、クライアント アプリケーションがパートナー サーバー上のミラー データベースへの接続を透過的に確立しようとします。 成功した場合は、接続がミラー データベースにリダイレクトされ、それが新しいプリンシパル データベースになります。

接続文字列でのフェールオーバー パートナーの指定

接続文字列でフェールオーバー パートナー サーバーの名前を指定すると、クライアント アプリケーションが最初に接続するときにプリンシパル データベースを使用できない場合、クライアントはフェールオーバー パートナーへの接続を透過的に試行します。

";Failover Partner=PartnerServerName"

フェールオーバー パートナー サーバー名を省略し、クライアント アプリケーションが最初に接続したときにプリンシパル データベースが使用できない場合、プロバイダーは SqlExceptionをスローします。

SqlConnectionが正常に開くと、サーバーはフェールオーバー パートナー名を返します。 その名前は、接続文字列の値よりも優先されます。

注

データベース ミラーリングのシナリオでは、接続文字列で初期カタログまたはデータベース名を明示的に指定する必要があります。 クライアントが、初期カタログやデータベースが明示的に指定されていない接続に関するフェールオーバー情報を受信する場合は、このフェールオーバー情報はキャッシュされず、アプリケーションはプリンシパル サーバーでの障害発生時にフェールオーバーを試行しません。 接続文字列にフェールオーバー パートナーの値が含まれていても、初期カタログまたはデータベースの値が存在しない場合は、InvalidArgumentException が生成されます。

現在のサーバー名の取得

フェールオーバー後、 DataSource プロパティを使用して、接続されているサーバーの名前を取得します。 次のコード フラグメントは、接続変数が SqlConnection クラスの開いているインスタンスを参照していることを前提としています。

フェールオーバー イベントが発生し、接続がミラー サーバーに切り替わると、ミラー名を反映するように DataSource プロパティが更新されます。

Dim activeServer As String = connection.DataSource
string activeServer = connection.DataSource;

SqlClient ミラーリングの動作

クライアントは、常に現在のプリンシパル サーバーに接続しようとします。 それが失敗した場合、フェールオーバーパートナーを試みます。 ミラー データベースが既にパートナー サーバー上のプリンシパル ロールに切り替えられている場合、接続は成功し、新しいプリンシパル/ミラーのマッピングがクライアントに送信され、AppDomain の呼び出しが有効な間はキャッシュされます。 永続ストレージには格納されず、別の AppDomain またはプロセス内の後続の接続では使用できません。 ただし、同じ AppDomain内の後続の接続で使用できます。 同じコンピューターまたは別のコンピューターで実行されている別の AppDomain またはプロセスには、常に接続のプールがあり、それらの接続はリセットされないことに注意してください。 その場合、プライマリ データベースがダウンすると、各プロセスまたは AppDomain が 1 回失敗し、プールが自動的にクリアされます。

注

サーバー上のミラーリングのサポートは、データベースごとに構成されます。 マルチパート名を使用するか、または現在のデータベースを変更し、プリンシパル/ミラー セットに含まれていない他のデータベースに対してデータ操作が行われた場合、障害が発生したときは、これらの他のデータベースへの変更は伝播されません。 ミラー化されていないデータベースでデータが変更されても、エラーは生成されません。 開発者は、このような操作の考えられる影響を評価する必要があります。

データベース ミラーリングに関するリソース

ミラーリングの構成、配置、管理の概念に関するドキュメントや情報については、SQL Server ドキュメントの次のリソースを参照してください。

リソース 説明
データベース ミラーリング SQL Server でのミラーリングの設定と構成方法について説明します。

関連項目