web-dev-qa-db-ja.com

リンボ状態のセッション-強制終了/ロールバック

スクリプトを使用してtxtファイルをftpサイトにダンプするために使用されるxp_cmdshellを呼び出すSQLjobがあります。

時々それは失敗し、ジョブは実行可能な状態でハングアップします。通常、セッションを強制終了すると、クリアされます。

ただし、リンボ状態でハングアップする2つのセッションがあります。

 sp_WHO2 53 -- running from 7/8/2018

SP_WHO2 53

SP_WHO2 98 -- running from 6/16/2018

SP_WHO2 98

ジョブステータスにはRunnableと表示されますが、コマンドはKILLED/ROLLBACKです。

SPID 53の確認

Kill 53 with status only 

出力

SPID 53: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds.

SPID 98の確認

KILL 98 with status only

出力

SPID 98: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds.

これらのセッションをクリアするにはどうすればよいですか?

SQL Serverでパフォーマンスの問題が発生し、これらのセッションが発生しました。私はいくつかの調査を行い、それがログファイルを増やし、パフォーマンスの問題を引き起こすと信じるように私に指摘しました。現在の問題がこれらのセッションが原因であるかどうかはわかりませんが、それらはアクティブで負荷の高いクエリです。だからここから始めようかと思った。私はここの開発者であり、SQL SERVER 2014ではアクティビティモニターが廃止されていることを認識していますが、アクティビティモニターを確認しました。以下は画像です。

Image from activity monitor - 1

Image from activity monitor - 2

どうすればそれを解決できるのか提案できますか?

私はブレントオザーによってそのようなシナリオについてのブログを読みました
- ロールバック:セッションを強制終了するとどうなりますか?

根本的な原因を修正することを検討しながら、難しい方法を学びました。

AK

4
user156968

xp_cmdshellで生成されたWindowsプロセスを強制終了しようとする可能性があります。そのプロセスはおそらく実行中であり、SQL Serverからspidを強制終了しても処理されないためです。あなたがそれを説明する方法は、ftpプログラムがまだ実行されていると思います。

これは、killコマンドは、プロセス外で開始されたプログラムを強制終了しないためです。

次のようなシナリオをシミュレートできます。

SQLクエリウィンドウでプロセスを開始します。

xp_cmdshell 'notepad.exe'

そして、そのspidをkillした後、sp_who2であなたと同じ出力を取得します

54      RUNNABLE                        Administrator   hostname      . master  KILLED/ROLLBACK     0   0   07/24 14:23:02  Microsoft SQL Server Management Studio - Query  54      0  

しかし、まだ実行中のnotepad.exeプロセスがあります。

C:\Users\Administrator>tasklist | find "notepad"
notepad.exe                   4676 Services                   0      3 788 K

Notepad.exeプロセスを強制終了すると、SQL Server spidも消えてしまいます。

プロセスを強制終了するために必要なプロセスを確認する場合は、エクスプローラーでsqlserver.exeの子プロセスとして次のように表示する必要があります(管理者としてprocexp.exeを起動する必要がある場合があります)。

enter image description here