現象
たとえば次のようなシナリオを考えてみます。
- Microsoft SQL Server 2016 Service Pack 2 (SP2) の累積的な更新プログラム 2 (CU2) 以降のバージョンを使用します。
- 多数のデータベース (通常は 200 を超えるデータベース) をホストするインスタンスを実行しており、そのインスタンスが Always On 可用性グループ (AG) の一部です (通常はセカンダリ サーバーの役割を持つ)。 注釈 すべてのユーザー データベースが AG に属している必要はありません。
- ボリューム シャドウ コピー サービス (VSS) アプリケーションを実行して、SQL Server インスタンスのすべてまたは一部のデータベースのバックアップを要求します。
このシナリオでは、SQL ライター サービス はデッドロック状態に達し、マスター (object_id 28 の sys.sysdbreg) の内部システム テーブルに対するロックを無期限に保持できます。 さらに、これらのロックにより、 sys.dm_hadr_database_replica_states などのシステム動的管理ビュー (DMV) からの読み取りが妨げられ、インスタンスで重大な 2 次的なブロックが発生する可能性があります。 さらに、ブロック チェーンの分析により、SQL Server VSS ライターから発信された次のステートメントがヘッド ブロックとして返されます。
"select name, recovery_model_desc, state_desc, CONVERT(integer, is_in_standby), ISNULL(source_database_id,0) from master.sys.databases"
その後、SQL Server の待機状態は ASYNC_NETWORK_IO になります。
注釈ASYNC_NETWORK_IO待機が実装されているため、それに対するwait_timeが 2 秒 (2,000 ミリ秒) を超えることはありません。 ただし、待機の種類は無期限に残り、この状況がそれ自体でブロックを解除することはありません。 状況のブロックを解除するには、SQL ライター サービスを強制終了する必要があります。
このヘッド ブロックによってブロックされた SPID の中に、多くの場合、DBSTARTUP SPID (alwayson セカンダリ DB やり直し) があります。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。
解決策
この問題は、次の SQL Server の累積的な更新プログラムで修正されています。
SQL Server の累積的な更新プログラムについて:
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。
参考資料
マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。