KILL (Transact-SQL)

セッション ID (SQL Server 2000 以前では SPID) または作業単位 (UOW) に基づき、ユーザーのプロセスを終了します。指定したセッション ID または UOW に元に戻す作業が多く含まれている場合など、長いトランザクションをロールバックする場合は、KILL ステートメントの実行に時間がかかることがあります。

SQL Server 2000 以降のバージョンでは、KILL を使用して通常の接続を終了することにより、指定したセッション ID に関連付けられたトランザクションを内部的に終了できます。Microsoft 分散トランザクション コーディネーター (MS DTC) を使用している場合は、このステートメントを使用して、状態が不明な孤立したトランザクションをすべて終了することもできます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

KILL { session ID | UOW } [ WITH STATUSONLY ] 

引数

  • session ID
    終了するプロセスのセッション ID です。session ID は、接続されたときに各ユーザー接続に割り当てられる一意の整数 (int 型) です。セッション ID の値は、接続の間、接続に関連付けられます。接続が終了すると、この整数値は解放され、新しい接続に再度割り当てることができます。

    指定したセッション ID に関連付けられた通常の非分散および分散トランザクションを終了する場合は、KILL session ID を使用します。

  • UOW
    分散トランザクションの作業単位 ID (UOW) を指定します。UOW は、sys.dm_tran_locks 動的管理ビューの request_owner_guid 列から取得できる GUID です。UOW は、エラー ログや MS DTC モニターからも取得できます。分散トランザクションの監視の詳細については、MS DTC のドキュメントを参照してください。

    KILL UOW は、孤立した分散トランザクションを終了する場合に使用できます。これらのトランザクションは、実際のどのセッション ID にも関連付けられていませんが、見かけ上のセッション ID = '-2' に関連付けられています。sys.dm_tran_locks、sys.dm_exec_sessions、または sys.dm_exec_requests のいずれかの動的管理ビューのセッション ID 列を照会すれば、孤立したトランザクションをこのセッション ID で容易に識別できます。

  • WITH STATUSONLY
    以前の KILL ステートメントに従ってロールバックされている、指定した session ID または UOW についての進行状況レポートを生成します。KILL WITH STATUSONLY は、session ID や UOW を終了またはロールバックしません。ロールバックの現在の進行状況を表示するだけです。

説明

通常 KILL は、他の重要なプロセスをロックしているプロセスを終了するときに使用されます。また、クエリが重要なシステム リソースを使用しており、プロセスがこのようなクエリを実行している場合、そのプロセスを終了するときにも使用されます。システム プロセスと拡張ストアド プロシージャを実行しているプロセスは終了できません。

重要なプロセスが実行している場合は特に、KILL の使用には十分注意してください。ユーザー自身のプロセスは終了できません。また、次のプロセスも終了できません。

  • AWAITING COMMAND

  • CHECKPOINT SLEEP

  • LAZY WRITER

  • LOCK MONITOR

  • SIGNAL HANDLER

現在のセッションのセッション ID 値を表示するには、@@SPID を使用します。

使用中のセッション ID 値に関するレポートを取得するには、sys.dm_tran_locks、sys.dm_exec_sessions、および sys.dm_exec_requests の各動的管理ビューで session_id 列にクエリを実行します。sp_who システム ストアド プロシージャが返す SPID 列を表示することもできます。特定の SPID のロールバックが進行中である場合、その SPID に関する sp_who 結果セット内の cmd 列には、"KILLED/ROLLBACK" が示されます。

特定の接続がデータベース リソースをロックして別の接続の進行を妨げている場合、sys.dm_exec_requests の blocking_session_id 列、または sp_who が返す blk 列に、ブロックしている接続のセッション ID が示されます。

KILL コマンドは、状態が不明な分散トランザクションの解決にも使用できます。これらのトランザクションは、データベース サーバーまたは MS DTC コーディネーターを予定外に再起動したために生じた未解決の分散トランザクションです。状態が不明なトランザクションの詳細については、「マークされたトランザクションの使用 (完全復旧モデル)」の「2 フェーズ コミット」を参照してください。

WITH STATUSONLY を使用する

KILL WITH STATUSONLY は、以前の KILL session ID|UOW ステートメントに従ってセッション ID または UOW が現在ロールバックされている場合にのみ、レポートを生成します。進行状況レポートは、次の形式で、完了したロールバックの進行状況 (% 単位) と予想残り時間 (秒単位) を示します。

Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: <yy>% Estimated time left: <zz> seconds

KILL session ID|UOW WITH STATUSONLY ステートメントの実行時にセッション ID または UOW のロールバックが完了している場合、あるいはロールバックするセッション ID または UOW が存在しない場合、KILL session ID|UOW WITH STATUSONLY は次のエラー メッセージを返します。

"メッセージ 6120、レベル 16、状態 1、行 1"

"状態レポートを取得できません。プロセス ID <session ID> のロールバック操作は実行中ではありません。"

WITH STATUSONLY オプションを設定しない状態で同じ KILL session ID|UOW ステートメントを繰り返すことによって、同じ状態レポートを取得できますが、このような操作は、お勧めできません。ロールバックが完了しており、新しい KILL ステートメントが実行される前にセッション ID が新しいタスクに再度割り当てられた場合、KILL session ID ステートメントの繰り返しによって、新しいプロセスが終了される可能性があります。WITH STATUSONLY を指定すると、このような状況が発生しなくなります。

権限

ALTER ANY CONNECTION 権限が必要です。ALTER ANY CONNECTION は、固定サーバー ロール sysadmin または processadmin のメンバーシップに含まれています。

A. KILL を使用してセッションを終了する

次の例では、セッション ID が 53 のプロセスを終了します。

KILL 53;
GO

B. KILL セッション ID WITH STATUSONLY を使用して進行状況レポートを取得する

次の例では、特定のセッション ID に対するロールバック プロセスの状態を取得します。

KILL 54;
KILL 54 WITH STATUSONLY;
GO

--This is the progress report.
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.

C. KILL を使用して、孤立した分散トランザクションを終了する

次の例では、UOW が D5499C66-E398-45CA-BF7E-DC9C194B48CF である、孤立した分散トランザクション (セッション ID = -2) を終了します。

KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF';