OLE DB Driver for SQL Server の高可用性、ディザスター リカバリーに関するサポート

対象者:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticsアナリティクスプラットフォームシステム(PDW)Microsoft FabricにおけるSQLデータベース

OLE DB ドライバーのダウンロード

この記事では、OLE DB Driver for SQL Server での Always On 可用性グループ のサポートについて説明します。 Always On 可用性グループの詳細については、「可用性グループ リスナー、クライアント接続、およびアプリケーションのフェールオーバー (SQL Server)」、「可用性グループの作成と構成 (SQL Server)」、「フェールオーバー クラスタリングと Always On 可用性グループ (SQL Server)」、および「アクティブなセカンダリ: 読み取り可能なセカンダリ レプリカ (Always On 可用性グループ)」を参照してください。

接続文字列で、特定の可用性グループの可用性グループ リスナーを指定できます。 フェールオーバーする可用性グループ内のデータベースに OLE DB Driver for SQL Server アプリケーションが接続されている場合、元の接続が切断されるため、フェールオーバー後にアプリケーションが動作を継続するには新しい接続を開く必要があります。

可用性グループ リスナーに接続しておらず、ホスト名に複数の IP アドレスが関連付けられている場合、OLE DB Driver for SQL Server では DNS エントリに関連付けられているすべての IP アドレスが順次繰り返し処理されます。 DNS サーバーが最初に返した IP アドレスがネットワーク インターフェイス カード (NIC) にバインドされていない場合、この処理に時間がかかる可能性があります。 可用性グループ リスナーに接続している場合、OLE DB Driver for SQL Server では同時にすべての IP アドレスとの間で接続の確立が試行されます。接続試行が成功した場合、ドライバーでは未解決の試行がすべて破棄されます。

Note

接続タイムアウト値を大きくし、接続再試行ロジックを実装することにより、アプリケーションが可用性グループに接続する確立が高まります。 また、可用性グループのフェールオーバーにより接続が失敗する可能性があるため、接続再試行ロジックを実装して、再接続されるまで、失敗した接続の再接続を試行する必要があります。

MultiSubnetFailoverとの接続

ターゲットがAzure SQL Database、Azure SQL Managed Instance、Microsoft FabricのSQL database、Always Onの可用性グループリスナー、またはSQL Serverのフェイルオーバークラスタインスタンスである場合は、必ずMultiSubnetFailover=Yesを指定してください。

接続文字列内のサーバー名が複数のIPアドレスに解決された場合、MultiSubnetFailover=YesはOLE DB Driver for SQL Serverにすべてのアドレスへの接続を同時に開き、応答した最初のアドレスを使うよう指示します。 それがなければ、ドライバーは一度に一つずつアドレスを試します。 応答しないアドレスはOSのTCP接続タイムアウトが終了するまで停止し、ドライバーが応答するアドレスに到達する前に接続タイムアウトが尽きてしまうことがあります。 フェイルオーバー後、ドライバーが最初に試みるアドレスがデータベースにサービスを提供しなくなったアドレスになることがあり、そのため他のアドレスに対して成功するはずの接続がタイムアウトで失敗します。

MultiSubnetFailover=Yes は、クライアントがデータベースにサービスを提供するレプリカを見つける速度を変えます。 サーバーのフェイルオーバーにかかる時間は変わりません。

MultiSubnetFailover=Yes は単一IPターゲットでは安全です。 DNSが単一のアドレスに解決されると、ドライバーは1回の接続試行を行うため、不要な設定はコストがかかりません。

接続文字列キーワードの詳細については、「OLE DB Driver for SQL Server での接続文字列キーワードの使用」を参照してください。

可用性グループまたはフェールオーバー クラスター インスタンス内のサーバーに接続する際には、次のガイドラインに従います。

  • MultiSubnetFailover接続プロパティを「はい」に設定してください。

  • 可用性グループに接続するには、接続文字列でサーバーとして、可用性グループの可用性グループ リスナーを指定します。

  • TCP以外のプロトコル上で MultiSubnetFailover を使うことはできません。

  • 64以上のIPアドレスで設定されたSQL Serverインスタンスに接続すると接続障害が発生します。

  • データベースミラーリングでは MultiSubnetFailover は使えません。 サーバーがデータベースがミラーリングされていると報告すると、ドライバーはエラーを返します。 データベースミラーリングは、サポートされているすべてのSQL Serverバージョンで推奨されていません。 代わりに Always On 可用性グループ を使用してください

  • 認証の種類であるSQL Server認証、Kerberos認証、またはWindows認証は、MultiSubnetFailover接続プロパティを使用するアプリケーションの動作に影響を与えません。

  • フェイルオーバー時間に対応し、アプリケーションの再試行を減らすために 、Connect Timeout の値を上げることができます。 既定値は 15 秒です。 同じ設定は IDBInitialize::Initialize で設定すると Timeout と呼ばれ、DBPROP_INIT_TIMEOUTプロパティにマッピングされます。 Azure SQL Databaseのサーバーレスで自動一時停止を有効にする場合は、少なくとも60秒のConnect Timeoutを使いましょう。 自動一時停止されたデータベースは最初の接続試行で再開されますが、その試みはエラー40613で失敗する可能性があり、データベースが再開される間にアプリケーションは再試行しなければなりません。 詳細は「 自動一時停止」と「自動再開」をご覧ください。

  • 分散トランザクションはサポートされていません。

読み取り専用のルーティングが無効である場合、次の状況では可用性グループのセカンダリ レプリカの場所には接続できません。

  1. セカンダリ レプリカの場所が接続を受け付けるように構成されていない場合。
  2. アプリケーションが ApplicationIntent=ReadWrite を使用し、セカンダリカレプリカの場所が読み取り専用アクセスに設定されている場合、

プライマリレプリカが読み取り専用ワークロードを拒否するように設定されており、その接続文字列にApplicationIntent=ReadOnlyが含まれている場合、接続が失敗します。

データベースミラーリングからのアップグレード

接続文字列にMultiSubnetFailoverFailover_Partnerキーワードの両方が含まれている場合、接続エラーが発生します。 また、MultiSubnetFailoverを使ってSQL Serverがフェイルオーバーパートナー応答を返し、データベースミラーリングペアの一部であることを示すエラーも発生します。

現在データベースミラーリングを使用しているOLE DB Driver for SQL Serverアプリケーションをマルチサブネットシナリオにアップグレードする場合は、Failover_Partner接続プロパティを削除し、MultiSubnetFailover「はい」に設定して置き換えてください。 接続文字列内のサーバー名を可用性グループのリスナーに置き換えます。 接続文字列がFailover_Partnerを使い、MultiSubnetFailover=Yesの場合、ドライバーはエラーを生成します。 しかし、接続文字列がFailover_Partnerを使い、MultiSubnetFailover=No(またはApplicationIntent=ReadWrite)を使用している場合、アプリケーションはデータベースミラーリングを使用します。

プライマリレプリカで可用性グループでデータベースミラーリングを使い、プライマリレプリカに接続する接続文字列でMultiSubnetFailover=Yesを使い、可用性グループのリスナーに接続すると、ドライバーはエラーを返します。

プログラム的にSet MultiSubnetFailoverを

対応する接続プロパティは次のとおりです。

  • SSPROP_INIT_MULTISUBNETFAILOVER
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Serverアプリケーションは、以下のいずれかの方法でMultiSubnetFailoverオプションを設定することができます。

  • IDBInitialize::Initialize
    以前設定されたプロパティセットを使ってデータソースを初期化し、データソースオブジェクトを作成します。 MultiSubnetFailoverをプロバイダープロパティまたは拡張プロパティの文字列の一部として指定してください。
  • IDataInitialize::GetDataSource
    MultiSubnetFailoverキーワードを含むことができる入力接続文字列を受け取ります。
  • IDBProperties::SetProperties
    MultiSubnetFailoverプロパティの値を設定するには、SSPROP_INIT_MULTISUBNETFAILOVERプロパティにVARIANT_TRUEまたはVARIANT_FALSE、またはDBPROP_INIT_PROVIDERSTRINGプロパティをプロパティに、MultiSubnetFailover=YesまたはMultiSubnetFailover=Noを含みます。

DBPROP rgPropMultisubnet;

rgPropMultisubnet.dwPropertyID = SSPROP_INIT_MULTISUBNETFAILOVER;
rgPropMultisubnet.dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropMultisubnet.dwStatus = DBPROPSTATUS_OK;
rgPropMultisubnet.colid = DB_NULLID;
V_VT(&(rgPropMultisubnet.vValue)) = VT_BOOL;
V_BOOL(&(rgPropMultisubnet.vValue)) = VARIANT_TRUE;

DBPROPSET PropSet;

PropSet.rgProperties = &rgPropMultisubnet;
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT;
IDBProperties* pIDBProperties = NULL;
hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
pIDBProperties->SetProperties(1, &PropSet);

アプリケーションの意図を指定する

接続文字列内にキーワード ApplicationIntent を指定できます。 割り当て可能な値は ReadWrite (既定値) または ReadOnly です。

ApplicationIntent=ReadOnly を設定すると、接続時にクライアントによって読み取りワークロードが要求されます。 サーバーでは、接続時と USE データベース ステートメントの実行時にこの意図が適用されます。

ApplicationIntent キーワードは、従来型の読み取り専用データベースに対しては動作しません。

ReadOnly のターゲット

接続で ReadOnly が選択された場合、その接続は、データベースに存在する可能性のある次の特別な構成のいずれかに割り当てられます。

  • Always On。 データベースでは、対象の可用性グループ データベースのワークロードの読み取りを許可または禁止できます。 この選択は、ALLOW_CONNECTIONS および PRIMARY_ROLE Transact-SQL ステートメントの SECONDARY_ROLE 句を使用して制御できます。

  • geo レプリケーション

  • 読み取りスケールアウト

これらの特別なターゲットがいずれも使用できない場合は、通常のデータベースから読み取られます。

ApplicationIntent キーワードを使用すると、"読み取り専用ルーティング" が有効になります。

読み取り専用ルーティング

読み取り専用ルーティングは、データベースの読み取り専用レプリカの可用性を実現する機能です。 読み取り専用ルーティングを有効にするには、次のすべてを適用します。

  • Always On 可用性グループ リスナーに接続する必要があります。

  • ApplicationIntent 接続文字列キーワードを ReadOnly に設定する必要があります。

  • データベース管理者は、読み取り専用ルーティングを有効にするように可用性グループを構成する必要があります。

複数の接続でそれぞれに読み取り専用ルーティングが使用されている場合、すべてが同じ読み取り専用レプリカに接続されるとは限りません。 データベースの同期変更またはサーバーのルーティング構成の変更は、異なる読み取り専用のレプリカに対するクライアントの接続につながることがあります。

接続文字列キーワードに可用性グループ リスナーを渡さ "Server" ことにより、すべての読み取り専用要求が同じ読み取り専用レプリカに接続されるようにすることができます。 代わりに、読み取り専用のインスタンスの名前を指定します。

読み取り専用ルーティングには、プライマリへの接続よりも時間がかかることがあります。 これは、読み取り専用ルーティングではまずプライマリに接続し、次に使用できる最善の読み取り可能なセカンダリを検索するためです。 このような複数のステップがあるため、login タイムアウトを少なくとも 30 秒に増やす必要があります。

アプリケーション意図

OLE DB Driver for SQL ServerはApplicationIntent 接続文字列キーワードをサポートしています。 接続文字列キーワードの詳細については、「OLE DB Driver for SQL Server での接続文字列キーワードの使用」を参照してください。

プログラム的にApplicationIntentを設定する

対応する接続プロパティは次のとおりです。

  • SSPROP_INIT_APPLICATIONINTENT
  • DBPROP_INIT_PROVIDERSTRING

OLE DB Driver for SQL Serverアプリケーションは、アプリケーション意図を指定するために以下のいずれかの方法を使用できます。

  • IDBInitialize::Initialize
    以前設定されたプロパティセットを使ってデータソースを初期化し、データソースオブジェクトを作成します。 アプリケーション インテントは、プロバイダーのプロパティとして指定するか、拡張プロパティ文字列の一部として指定します。
  • IDataInitialize::GetDataSource
    Application Intentキーワードを含む入力接続文字列を受け取ります。
  • IDBProperties::SetProperties
    ApplicationIntentプロパティの値を設定するには、SSPROP_INIT_APPLICATIONINTENTプロパティにReadWriteまたはReadOnly、またはApplicationIntent=ReadOnly またはApplicationIntent=ReadWriteを含むDBPROP_INIT_PROVIDERSTRINGプロパティを呼び出します。

アプリケーション意図は、データリンクプロパティダイアログボックスの「全」タブの「アプリケーション意図プロパティ」フィールドで指定できます。

暗黙的接続を確立すると、暗黙的接続は親接続のアプリケーション意図設定を使用します。 同様に、同じデータソースから作成された複数のセッションは、そのデータソースのアプリケーション意図設定を継承します。