SQL Server Native Client の HADR サポート

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

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

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

可用性グループ リスナーに接続せず、複数の IP アドレスがホスト名に関連付けられている場合、SQL Server Native Clientは DNS エントリに関連付けられているすべての IP アドレスを順番に反復処理します。 DNS サーバーが最初に返した IP アドレスがネットワーク インターフェイス カード (NIC) にバインドされていない場合、この処理に時間がかかる可能性があります。 可用性グループ リスナーに接続すると、SQL Server Native Clientはすべての IP アドレスへの接続を並列に確立しようとします。接続試行が成功すると、ドライバーは保留中の接続試行をすべて破棄します。

Note

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

MultiSubnetFailover を使用した接続

SQL Server 2012 可用性グループ リスナーまたは SQL Server 2012 フェールオーバー クラスター インスタンスに接続する際には、必ず MultiSubnetFailover=Yes を指定してください。 MultiSubnetFailover を使用すると、SQL Server 2012 のすべての可用性グループとフェールオーバー クラスター インスタンスのフェールオーバーが高速化され、単一サブネットとマルチサブネットのAlways On トポロジのフェールオーバー時間が大幅に短縮されます。 マルチサブネット フェールオーバーの際には、クライアントは複数の接続を並列で試行します。 サブネットのフェールオーバー中に、SQL Server Native Clientは TCP 接続を積極的に再試行します。

MultiSubnetFailover 接続プロパティは、アプリケーションが可用性グループまたはフェールオーバー クラスター インスタンスにデプロイされていること、およびSQL Server Native Clientが、すべての IP アドレスへの接続を試みることによってプライマリ SQL Server インスタンス上のデータベースへの接続を試行することを示します。 接続に対して MultiSubnetFailover=Yes を指定した場合、オペレーティング システムの既定の TCP 再送信間隔より短い間隔で、クライアントにより TCP 接続が再試行されます。 これにより、Always On 可用性グループまたは Always On フェールオーバー クラスター インスタンスのフェールオーバー後、再接続されるまでの時間を短縮することができます。単一サブネットとマルチサブネットの可用性グループ インスタンスおよびフェールオーバー クラスター インスタンスに適用することができます。

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

可用性グループ リスナーまたはフェールオーバー クラスター インスタンス以外に接続するときに MultiSubnetFailover=Yes を指定するとパフォーマンスが低下する可能性があるため、このような指定はサポートされていません。

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

  • 単一サブネットまたはマルチサブネットに接続する場合に MultiSubnetFailover 接続プロパティを使用すると、パフォーマンスを向上させることができます。

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

  • 64 個を超える数の IP アドレスが構成された SQL Server インスタンスに接続すると、接続エラーが発生します。

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

  • loginTimeout の値を増やすことで、フェールオーバー時間に対応し、アプリケーションの接続試行回数を減らすことができます。

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

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

  1. セカンダリ レプリカの場所が、接続を許可するように構成されていない。

  2. アプリケーションに ApplicationIntent=ReadWrite (後述します) が使用されているが、セカンダリ レプリカの場所が読み取り専用アクセスとして構成されている。

プライマリ レプリカが読み取り専用ワークロードを拒否するように構成されているとき、接続文字列に ApplicationIntent=ReadOnly が含まれていると、接続は失敗します。

データベース ミラーリングの使用からマルチサブネット クラスターの使用へのアップグレード

接続文字列に MultiSubnetFailover および Failover_Partner の接続キーワードが存在する場合、接続エラーが発生します。 また、MultiSubnetFailover が使用されているとき、SQL Server から、データベース ミラーリング ペアに属していることを示すフェールオーバー パートナー応答が返された場合にも、エラーが発生します。

現在データベース ミラーリングを使用しているSQL Server Native Client アプリケーションをマルチサブネット シナリオにアップグレードする場合は、Failover_Partner接続プロパティを削除し、MultiSubnetFailoverYes に設定して置き換え、接続文字列内のサーバー名を可用性グループ リスナーに置き換える必要があります。 接続文字列で Failover_Partner および MultiSubnetFailover=Yes が使用されている場合、ドライバーでエラーが発生します。 ただし、接続文字列に Failover_PartnerMultiSubnetFailover=No (または ApplicationIntent=ReadWrite) が使用されている場合、アプリケーションはデータベース ミラーリングを使用します。

ドライバーは、可用性グループのプライマリ データベースでデータベース ミラーリングが使用されている場合、および可用性グループ リスナーではなくプライマリ データベースに接続する接続文字列内で MultiSubnetFailover=Yes が使用されている場合、エラーを返します。

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

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

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

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

ReadOnly のターゲット

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

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

  • geo レプリケーション

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

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

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

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

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

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

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

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

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

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

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

ODBC

SQL Server Native Clientの可用性グループAlways Onサポートするために、2 つの ODBC 接続文字列キーワードが追加されました。

  • ApplicationIntent

  • MultiSubnetFailover

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

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

  • SQL_COPT_SS_APPLICATION_INTENT

  • SQL_COPT_SS_MULTISUBNET_FAILOVER

SQL Server Native Clientの ODBC 接続プロパティの詳細については、「SQLSetConnectAttr」を参照してください。

ApplicationIntent キーワードと MultiSubnetFailover キーワードの機能は、SQL Server Native Client ドライバーを使用する DSN の ODBC データ ソース アドミニストレーターで公開されます。これは、SQL Server 2012 (11.x) 以降です。

SQL Server Native Client ODBC アプリケーションでは、次の 3 つの関数のいずれかを使用して接続を確立できます。

機能 説明
SQLBrowseConnect SQLBrowseConnect から返されるサーバーの一覧に VNN は含まれません。 サーバーがスタンドアロン サーバーであるか、Windows Server フェールオーバー クラスタリング (WSFC) クラスター内のプライマリまたはセカンダリ サーバーで、Always On可用性グループに対して有効になっている 2 つ以上のSQL Server インスタンスが含まれている場合は、サーバーの一覧のみが表示されます。 サーバーへの接続時にエラーが返された場合、接続先のサーバーの構成に ApplicationIntent 設定との互換性がないことが原因として考えられます。

SQLBrowseConnect は、Always On可用性グループに対して有効になっている 2 つ以上のSQL Server インスタンスを含む Windows Server フェールオーバー クラスタリング (WSFC) クラスター内のサーバーを認識しないため、SQLBrowseConnectMultiSubnetFailover 接続文字列キーワード (keyword)を無視します。
SQLConnect SQLConnect は、データ ソース名 (DSN) または接続プロパティを介して ApplicationIntentMultiSubnetFailover の両方をサポートしています。
SQLDriverConnect SQLDriverConnect は、接続文字列キーワード、接続プロパティ、または DSN を介して、 ApplicationIntentMultiSubnetFailover をサポートしています。

OLE DB (OLE DB)

SQL Server Native Clientの OLE DB では、MultiSubnetFailover キーワード (keyword)はサポートされていません。

SQL Server Native Clientの OLE DB では、アプリケーションの意図がサポートされます。 OLE DB アプリケーションにおけるアプリケーション インテントの動作は、ODBC アプリケーションの場合と同じです (上記を参照)。

1 つの OLE DB 接続文字列キーワード (keyword)、SQL Server Native ClientのAlways On可用性グループをサポートするために追加されます。

  • Application Intent

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

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

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

SQL SERVER NATIVE CLIENT OLE DB アプリケーションでは、次のいずれかのメソッドを使用して、アプリケーションの意図を指定できます。

IDBInitialize::Initialize
IDBInitialize::Initialize は、あらかじめ構成された一連のプロパティを使用して、データ ソースを初期化し、データ ソース オブジェクトを作成します。 アプリケーション インテントは、プロバイダーのプロパティとして指定するか、拡張プロパティ文字列の一部として指定します。

IDataInitialize::GetDataSource
IDataInitialize::GetDataSourceApplication Intent キーワードを格納できる入力接続文字列を受け取ります。

IDBProperties::GetProperties
IDBProperties::GetProperties は、現在データ ソースに設定されているプロパティの値を取得します。 Application Intent の値は、DBPROP_INIT_PROVIDERSTRING プロパティおよび SSPROP_INIT_APPLICATIONINTENT プロパティを通じて取得できます。

IDBProperties::SetProperties
ApplicationIntent プロパティ値を設定するには、IDBProperties::SetProperties を呼び出して、"ReadWrite" または "ReadOnly" の値で SSPROP_INIT_APPLICATIONINTENT プロパティを渡すか、または "ApplicationIntent=ReadOnly" または "ApplicationIntent=ReadWrite" を含む値で DBPROP_INIT_PROVIDERSTRING プロパティを渡します。

アプリケーション インテントは、 [データ リンク プロパティ] ダイアログ ボックスの [すべて] タブの [アプリケーション インテントのプロパティ] フィールドで指定できます。

暗黙的な接続が確立された場合、その接続には、親の接続のアプリケーション インテント設定が使用されます。 同様に、同じデータ ソースから作成されたセッションはいずれも、そのデータ ソースのアプリケーション インテント設定を継承します。

参照

SQL Server Native Client の機能
SQL Server Native Client での接続文字列キーワードの使用