データベース ミラーリング セッションへの最初の接続
クライアントはミラー化されたデータベースに初めて接続するときに、最低限サーバー インスタンスの名前を含む接続文字列を指定する必要があります。この必須のサーバー名は、現在のプリンシパル サーバー インスタンスを特定するもので、イニシャル パートナー名と呼びます。
接続文字列には、必要に応じて、別のサーバー インスタンスの名前を指定することもできます。この名前は、現在のミラー サーバー インスタンスを特定するもので、最初の接続試行でイニシャル パートナーを使用できない場合に使用されます。この 2 つ目の名前をフェールオーバー パートナー名と呼びます。
また、接続文字列にはデータベース名も指定する必要があります。データベース名は、データ アクセス プロバイダがフェールオーバーを試行できるようにするために必要です。
データ アクセス プロバイダは接続文字列を受け取ると、イニシャル パートナー名とフェールオーバー パートナー名 (指定された場合) をクライアントの揮発性メモリのキャッシュに格納します (マネージ コードの場合、キャッシュはアプリケーション ドメインにスコープが設定されます)。キャッシュに保存されたイニシャル パートナー名は、データ アクセス プロバイダによって更新されません。クライアントがフェールオーバー パートナー名を指定した場合、データ アクセス プロバイダでは、イニシャル パートナー名を使用して接続できなかった場合に備えて、このフェールオーバー パートナー名も一時的に保存します。
データベース ミラーリング セッションによる保護は、クライアント コンピュータでネットワーク通信に関する問題が発生した場合など、サーバーへのアクセスに関するクライアント固有の問題には対処できません。ミラー化されたデータベースへの接続は、データ アクセス プロバイダに関連しない原因で失敗することもあります。たとえば、データベースがフェールオーバー中である場合や、ネットワーク エラーが発生した場合に、プリンシパル サーバー インスタンスがアクティブでないことが原因で接続試行が失敗することがあります。
データ アクセス プロバイダでは、まずイニシャル パートナー名を使用して接続を試行します。通常、指定したサーバー インスタンスが使用可能で、それが現在のプリンシパル サーバー インスタンスであれば接続は成功します。
注意 |
---|
ミラーリング セッションが一時停止した場合、通常、クライアントはプリンシパル サーバーに接続し、パートナー名をダウンロードします。ただし、ミラーリングが再開されるまで、クライアントはデータベースにアクセスできません。 |
イニシャル パートナー名で接続できない場合、フェールオーバー パートナー名 (指定された場合) で接続を試行します。いずれかのパートナー名で現在のプリンシパル サーバーを正しく特定できると、正常に最初の接続を開くことができます。この接続が完了すると、現在のミラー サーバーのサーバー インスタンス名をダウンロードします。この名前はフェールオーバー パートナー名としてキャッシュに保存され、クライアントが指定したフェールオーバー パートナー名 (存在する場合) が上書きされます。その後、.NET Framework Data Provider for SQL Server はこのフェールオーバー パートナー名を更新しません。それに対して、SQL Server Native Client は、その後の接続や接続のリセットにより異なるパートナー名が返されたときはキャッシュを更新します。
次の図は、Db_1 という名前のミラー化されたデータベースのイニシャル パートナーである Partner_A へのクライアント接続を示しています。この図では、クライアントが指定したイニシャル パートナー名が現在のプリンシパル サーバーである Partner_A を正しく特定しています。最初の接続試行が成功し、データ アクセス プロバイダのローカル キャッシュに、ミラー サーバーの名前 (現在は Partner_B) がフェールオーバー パートナー名として保存されます。最後に、クライアントが Db_1 データベースのプリンシパル コピーに接続されます。
最初の接続試行は、ネットワーク エラーやアクティブでないサーバー インスタンスが原因で失敗する場合があります。最初のパートナーが使用できないときに、データ アクセス プロバイダがフェールオーバー パートナーへの接続を試行するには、クライアントが接続文字列にフェールオーバー パートナー名を指定している必要があります。
フェールオーバー パートナー名が指定されていなければ、ネットワーク接続がタイムアウトになるかエラーが返されるまで、元の接続試行が続行されます (データベースがミラー化されていない場合と同じ動作です)。
接続文字列にフェールオーバー パートナー名を指定した場合、データ アクセス プロバイダの動作は、クライアントのネットワーク プロトコルとオペレーティング システムによって次のように異なります。
TCP/IP では、クライアントが Microsoft Windows XP 以降を実行している場合、データベース ミラーリング固有の接続再試行アルゴリズムによって接続試行が規制されます。接続再試行アルゴリズムは、1 回の接続試行で接続を開くのに割り当てる最大時間 (再試行時間) を決定します。詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。
他のネットワーク プロトコルを使用しているか、クライアントが Microsoft Windows XP 以降を実行していない場合
エラーが発生するか、イニシャル パートナーを使用できない場合、最初の接続試行は、ネットワーク接続がタイムアウトになるか、データ アクセス プロバイダのログインがタイムアウトになるまで待機します。通常、この待機時間は 20 ~ 30 秒です。データ アクセス プロバイダがタイムアウトしなければ、フェールオーバー パートナーへの接続が試行されます。接続が成功する前に接続がタイムアウトになるか、フェールオーバー パートナーを使用できない場合、接続試行は失敗します。ログインがタイムアウトになる前に、フェールオーバー パートナーが使用でき、そのパートナーがその時点のプリンシパル サーバーの場合、接続試行は成功します。
ミラー化されたデータベースの接続文字列
クライアントが指定する接続文字列には、データ アクセス プロバイダがデータベースへの接続に使用する情報が含まれています。ここでは特に、ミラー化されたデータベースに SQL Server Native Client の ODBC ドライバ接続を使用して接続する場合のキーワードについて説明します。接続文字列のすべてのキーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。
Network 属性
接続文字列には、ネットワーク プロトコルを指定するための Network 属性を含めます。この属性を含めると、異なるパートナーに接続を切り替えても、指定したネットワーク プロトコルが保持されます。ミラー化されたデータベースへの接続に最も適したプロトコルは TCP/IP です。クライアントがパートナーへのすべての接続に TCP/IP を要求するには、接続文字列に次の属性を指定します。
Network=dbmssocn;
重要 |
---|
TCP/IP はクライアントのプロトコル一覧の先頭に指定することをお勧めします。ただし、接続文字列に Network 属性を指定した場合は、そのプロトコルが一覧の順序よりも優先されます。 |
また、クライアントがパートナーへのすべての接続に名前付きパイプを要求するには、接続文字列に次の属性を指定します。
Network=dbnmpntw;
重要 |
---|
名前付きパイプでは TCP/IP の再試行アルゴリズムを使用しないので、多くの場合、名前付きパイプによる接続試行はミラー化されたデータベースに接続される前にタイムアウトします。 |
Server 属性
接続文字列には、イニシャル パートナー名を指定する Server 属性を含める必要があります。この名前で現在のプリンシパル サーバー インスタンスを特定します。
サーバー インスタンスを特定する最も簡単な方法は、<server_name>[\<SQL_Server_instance_name>] の形式でインスタンス名を指定することです。次に例を示します。
Server=Partner_A;
または
Server=Partner_A\Instance_2;
ただし、システム名を使用するときは、クライアントは DNS 参照を実行してサーバーの IP アドレスを取得し、SQL Server Browser クエリを実行してパートナーが存在するサーバーのポート番号を取得する必要があります。Server 属性にパートナーのサーバー名ではなく IP アドレスとポート番号を指定すると、こうした参照やクエリを回避できます。パートナーへの接続中に外部遅延が発生する可能性を最小限に抑えるために、この指定を行うことをお勧めします。
注意 |
---|
接続文字列に名前付きインスタンス名を指定し、ポート名を指定しない場合は、SQL Server Browser クエリの実行が必要です。 |
Server 属性では、Server=<ip_address>,<port> という形式で IP アドレスとポートを指定します。次に例を示します。
Server=123.34.45.56,4724;
注意 |
---|
IP アドレスには、IP Version 4 (IPv4) または IP Version 6 (IPv6) を使用できます。 |
Database 属性
接続文字列には、ミラー化されたデータベースの名前を指定する Database 属性も指定する必要があります。クライアントが接続を試行したときにデータベースを使用できない場合は、例外が発生します。
たとえば、プリンシパル サーバー Partner_A の AdventureWorks データベースに明示的に接続するには、クライアントで次の接続文字列を使用します。
" Server=Partner_A; Database=AdventureWorks "
注意 |
---|
この文字列では、認証情報が省略されています。統合認証用のキーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。 |
重要 |
---|
Server 属性にプロトコル プレフィックスを指定すると (Server=tcp:<servername>)、Network 属性と互換性がなくなります。また、両方の属性にプロトコルを指定すると、エラーが発生する可能性が高くなります。このため、接続文字列でプロトコルを指定するときには Network 属性を使用し、Server 属性にはサーバー名だけを指定することをお勧めします。つまり、"Network=dbmssocn; Server=<servername>" という形式を使用します。 |
Failover Partner 属性
クライアントは、イニシャル パートナー名以外に、現在のミラー サーバー インスタンスを特定するフェールオーバー パートナー名も指定できます。フェールオーバー パートナーは、Failover Partner 属性を表すいずれかのキーワードで指定します。この属性を表すキーワードは、使用する API によって異なります。次の表は、これらのキーワードを示しています。
API |
Failover Partner 属性を表すキーワード |
---|---|
OLE DB プロバイダ |
FailoverPartner |
ODBC ドライバ |
Failover_Partner |
ActiveX Data Objects (ADO) |
Failover Partner |
これらの API のキーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。
サーバー インスタンスを特定する最も簡単な方法は、そのインスタンスのシステム名を <server_name>[\<SQL_Server_instance_name>] という形式で指定することです。
また、Failover Partner 属性に IP アドレスとポート番号を指定することもできます。これにより、最初の接続試行がデータベースへの最初の接続に失敗した場合、DNS と SQL Server Browser に依存しないでフェールオーバー パートナーへの接続を試行できます。接続が確立されると、指定したフェールオーバー パートナー名が接続時のフェールオーバー パートナー名に上書きされるので、次にフェールオーバーが発生した場合、リダイレクトされた接続では DNS と SQL Server Browser が必要になります。
注意 |
---|
イニシャル パートナー名のみを指定すると、アプリケーション開発者が操作を実行したり、再接続方法以外のコードを記述したりする必要はありません。 |
注意 |
---|
マネージ コード アプリケーションの開発者は SqlConnection オブジェクトの ConnectionString でフェールオーバー パートナー名を指定します。この接続文字列の使用方法については、Microsoft .NET Framework SDK に含まれている ADO.NET マニュアルの「Database Mirroring Support in the .NET Framework Data Provider for SQL Server」を参照してください。 |
接続文字列の例
たとえば、TCP/IP を使用して Partner_A または Partner_B の AdventureWorks データベースに明示的に接続するには、ODBC ドライバを使用するクライアント アプリケーションで次の接続文字列を指定します。
"Server=Partner_A; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"
また、クライアントはイニシャル パートナーの Partner_A を特定するために、IP アドレスとポート番号を指定できます。たとえば、IP アドレスが 250.65.43.21 でポート番号が 4734 の場合、接続文字列は次のようになります。
"Server=250.65.43.21,4734; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"