web-dev-qa-db-ja.com

長時間実行されているMSSQLクエリを安全に強制終了するにはどうすればよいですか?

最近、データベースにSQLジョブを挿入しました。クエリは不必要に数日間実行されていたため、KILL SPIDを使用して強制終了されました。その後、プロセスは数日間ロールバックし始め、そこでハングしているように見えました。

STATUSONLYでKILL SPIDを実行すると、「推定完了」が100%、「残り時間」が0秒であるというメッセージが表示されました。

最終的に、プロセスを削除したSQLサービスを再起動する必要がありました。

私の質問は、SQLプロセスをどのように強制終了するかです。これが唯一の方法ですか?

5
Anonymous

あなたはすべてを正しく行いましたが、ロールバックのコストを考慮しました。クエリが数日間実行されていたため、コミットされていないトランザクションとしてログファイルに数日分のデータが書き込まれることになります。タスクを強制終了すると、ロールバックが開始され、これが待たなければなりません。

より少ない影響でトランザクションを強制終了できるようにしたい場合は、トランザクションをバッチ処理し、不定期にコミットすることを検討してください。トランザクションを完全に回避できる場合は、長時間実行されるジョブに適しています。

5
Dave Cheney

私はあなたが説明するようにロールバックの「ハング」を見ました、そしてそれを取り除く唯一の方法はあなたがしたようにSQLサービスを再起動することです。

[〜#〜] but [〜#〜]ロールバックが実際にハングしておらず、実際にロールバックされていないことを確認することが重要です(ご覧のとおり、WITH STATUSONLYは完全には信頼できません) )。リスクは、ロールバック中に実際にロールバックしている間にSQLサービスを再起動すると、データベースは「リカバリ」モードでスタックしたままになるということです。ロールバックが完了するまで、SQLサービスを再起動します。

SQLアクティビティモニターを更新して、CPUやIO SPIDのカウントがまだ進んでいるかどうかを確認することです。その後、ロールバックはまだ進行中であり、SQLをまだ再起動しないでください。

1つの追加ポイント:ログファイルの削除など、おかしなことをしたくありません。これによりトランザクションのロールバックが「停止」しますが、データベースの整合性が犠牲になります。私が使用した他の唯一の手法(ロールバックされたトランザクションがonlyの最後のバックアップ以降のデータベースへの重要な変更であると仮定)は、単に復元することですロールバックの発生をさらに1日待つよりも速くて簡単だと判断した最新のバックアップから。もちろん、これはデータベースアクティビティの性質に大きく依存します。

3
BradC