SQL Server AlwaysOn フェールオーバー クラスター インスタンス 環境に .NET Framework 4.6 をインストール後、メンテナンスプラン から SQL Server への接続に失敗する

高原 伸城

Support Escalation Engineer

 

皆さん、こんにちは。 BI Data Platform サポートチームの 高原 です。

今回は、SQL Server AlwaysOn フェールオーバー クラスター インスタンス 環境に .NET Framework 4.6 をインストール後、メンテナンスプラン から SQL Server への接続に失敗する問題について紹介します。

 

SQL Server AlwaysOn フェールオーバー クラスター インスタンス環境 (以下 SQL Server AlwaysOn FCI) で、かつ、名前付きインスタンスをインストールした環境に、.NET Framework 4.6 をインストールすると、メンテンナンス プラン 及び syspolicy_purge_history ジョブ から 該当の名前付きインスタンスに接続しようとした際に、以下のエラーにより、接続に失敗するという現象が発生します。

この問題は、スタンドアローン環境 及び SQL Server AlwaysOn フェールオーバー クラスター インスタンス環境で、かつ、既定のインスタンス では発生しません。

 

[メンテナンス プラン エラー例]

Error: ****-**-** **:**:**.**     Code: 0xC0024104     Source: Shrink Database Task Description: The Execute method on the task returned error code 0x80131904 (A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) ).

 

[syspolicy_purge_history ジョブ エラー例]

ジョブ ステップは、PowerShell スクリプトの 2 行目でエラーを受け取りました。対応する行は '(Get-Item SQLSERVER:\SQLPolicy\****\***$a).EraseSystemHealthPhantomRecords()' です。スクリプトを修正し、ジョブのスケジュールを設定し直してください。PowerShell によって返されたエラー情報: 'サーバー  に接続できませんでした。 SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。 インスタンス名が正しいこと、および SQL Server が リモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces error: 26 - 指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました)   '.

 

[ 原因]

技術情報 3078663 の .NET Framework 4.6 の問題により、メンテナンスプラン 及び syspolicy_purge_history ジョブから、SQL Server AlwaysOn FCI 上の名前付きインスタンスへの接続の際、接続先インスタンス名の正常性チェックが行われますが、本チェックが成功しないために発生します。

 

Add Connection dialog box doesn't load server names in the drop-down list after you apply the .NET Framework 4.6

 

[ 対処方法]

以下のいずれかの対処方法を実施します。

A) .NET Framework 4.6.1 以降にアップデートします。 B) 明示的に名前付きインスタンスがリッスンしているポートを指定し、該当インスタンスに接続します。

 

以下にそれぞれの対処方法の詳細を記載します。

 

A) .NET Framework 4.6.1 以降にアップデートします。

---------------------------------------------------------

技術情報 3078663 の現象は、.NET Framework 4.6.1 で修正されています。 そのため、.NET Framework 4.6.1 以降にアップデートすることで、本現象を改善することができます。

 

B) 名前付きインスタンスがリッスンしているTCPポートを明示的に指定し、該当インスタンスに接続します。

---------------------------------------------------------

SQL Serer へ接続する際、明示的に名前付きインスタンスがリッスンしているポートを指定することで、問題が発生する接続先インスタンス名の正常性チェックが行われなくなるため、有効な対処方法となります。

なお、名前付きインスタンスの場合、インスタンス起動時に、該当インスタンスをリッスンするポートが動的に決定されます。

そのため、本現象の対処として、名前付きインスタンスでリッスンされるTCPポートを固定した後、固定化したポートで毎回接続が行われるように別名を作成することを推奨します。

 

特定の TCP ポートで受信待ちするようにサーバーを構成する方法 (SQL Server 構成マネージャー)

 

[例] 名前付きインスタンスのリッスンポートを “50001” に変更する場合 image

 

クライアントが使用するサーバーの別名の作成または削除 (SQL Server 構成マネージャー)

※ [別名] と [サーバー] に「<サーバー名>\<インスタンス名>」を記載し、[プロトコル] は「TCP/IP」を選択し、[ポート番号] にポートを記載します。

 

[例] 名前付きインスタンスの別名で接続ポートを “50001” に指定する場合 image

 

[補足]

SQL Server Management Studioで SQL Server AlwaysOn FCI 名前付きインスタンスに接続する際、FQDN でサーバー名を指定し、接続した状態でメンテナンス プランを作成した場合においても、今回の現象を解消することが可能です。

また、syspolicy_purge_history ジョブ の場合においても、該当ジョブのステップ “Erase Phantom System Health Records” の “$(ESCAPE_NONE(SRVR))” を FQDN名で指定することにより、今回の現象を解消することが可能です。

しかしながら、上記に記載した 対処方法 A、B を実施することを推奨しています。

 

[例] 名前付きインスタンス名が “FCI.ad.com\Instance1” の場合

if ('$(ESCAPE_SQUOTE(INST))' -eq 'MSSQLSERVER') {$a = '\DEFAULT'} ELSE {$a = ''};(Get-Item SQLSERVER:\SQLPolicy\FCI.ad.com\Instance1$a).EraseSystemHealthPhantomRecords()

# syspolicy_purge_history ジョブ : ステップ “Erase Phantom System Health Records” image

 

 

※ 本Blogの内容は、2017年10月現在の内容となっております。