現象
Microsoft SQL Server 2014、2016または2017がインストールされていることを前提としています。 次の1つ以上の問題が発生する可能性があります。
-
SQL Server インスタンスが応答しない状態になり、"解放スケジューラ" というエラーが発生します。 回復するには、サーバーの再起動が必要になることがあります。
-
トランザクションのロールバックが完了するまでに時間がかかる場合があります。 ほとんどの場合、インスタンスを再起動すると、データベースはロールバックよりもずっと速く回復することができます。 ロールバックの完了までに長い時間がかかる場合があることに注意してください。再起動を試みる前にロールバックのモニタリングの詳細については、以下の「詳細情報」セクションを参照してください。
-
SOS_OBJECT_STORE のように、spinlocks には高待ち時間が表示されることがあります。
解決方法
この問題は、SQL Server の次の累積的な更新プログラムで修正されています。
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムを確認します。
SQL Server 2017 の最新の累積的な更新プログラム
SQL Server の Service pack 情報
この更新プログラムは、SQL Server 用の次の service pack で修正されています。
サービスパックは累積されます。 Service Pack は累積的であり、 最新の Service Pack には新しい修正プログラムと共に、それ以前の Service Pack に含まれていたすべての修正プログラムが含まれています。 このサービスパックの最新の service pack と最新の累積的な更新プログラムを適用することをお勧めします。 最新の service pack をインストールする前に、以前のサービスパックをインストールする必要はありません。 最新の service pack と最新の累積的な更新プログラムの詳細については、次の記事の表1を参照してください。
詳細情報
ロールバックの実行に時間がかかるのは、多くの理由があります。これには、長時間トランザクション、トランザクションログファイル内の VLFs の数、非常に遅い i/o などがあります。 この記事で説明されている問題が、スローロールバックの根本的な原因であることを確認するために、ロールバック操作の進行状況を監視するために、次の手法を使用することをお勧めします。
-
Sys.dm_exec_requestsで、コマンドが "KILL/ROLLBACK" に設定されている session_id を特定し、進行状況を示す IO と CPU 時間の両方がセッションで累積されることを確認します。 IO が変更されていない場合は、この記事で説明されている問題が発生していることを示している可能性があります。
-
クエリ sys.dm_tran_database_transactions : 次のようなクエリを使用して、ロールバックの現在の状態を特定します。
Getdate () を CurrentTime、database_transaction_next_undo_lsn、database_transaction_begin_lsn、t.transaction_id、database_transaction_begin_time、database_transaction_log_record_count、db_name (t.database_id) として選択します。
Sys.dm_tran_database_transactions t から
Sys.dm_exec_requests s に参加する T.transaction_id = s.transaction_id
T.database_id = db_id (' <データベース名') と s.session_id =<Session_id ロールバック操作を実行して>
注:
上のクエリでは、
database_transaction_next_undo_lsn は、元に戻す次のレコードの lsn です。 database_transaction_begin_lsn は、トランザクションログ内のトランザクションの開始レコードの lsn です。
このクエリの各スナップショットでdatabase_transaction_next_undo_lsnを減らす必要があります。 Database_transaction_next_undo_lsnが database_transaction_begin_lsn に達すると、Rollback は正常に完了します。
ここでの目標は、事前に定義された間隔で、前のクエリのスナップショットをいくつか実行し、その間隔内で database_transaction_next_undo_lsn で処理された lsns のデルタを使用して、 database_transaction_next_undo_lsn が database_transaction_begin_lsnに到達するまでにかかる時間を見積もることです。
ロールバックが各スナップショット間の適正な速度で進行している場合は、SQL Server インスタンスを再起動しなくても、ロールバックを単独で実行できることをお勧めします。
長時間の回復の詳細については、次の記事を参照してください。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
関連情報
ソフトウェアの更新を説明するために Microsoft が使用する 用語について説明します。