KILL (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のSQL 分析エンドポイント Microsoft Fabric のウェアハウス
セッション ID または作業単位 (UOW) に基づいてユーザーのプロセスを終了します。 指定されたセッション ID または UOW で元に戻す作業が多い場合、 KILL
ステートメントの完了に時間がかかる場合があります。 特に、プロセスに長いトランザクションのロールバックが含まれている場合、このプロセスは完了するまで時間がかかります。
KILL
は通常の接続を終了します。これは、指定されたセッション ID に関連付けられているトランザクションを内部的に停止します。 Microsoft 分散トランザクション コーディネーター (MS DTC) が使用されることがあります。 MS DTC が使用されている場合も、このステートメントを使用して、孤立している分散トランザクションと疑いのある分散トランザクションを終了できます。
構文
SQL Server、Azure SQL Database、および Azure SQL Managed Instance の構文:
KILL { session_id [ WITH STATUSONLY ] | UOW [ WITH STATUSONLY | COMMIT | ROLLBACK ] }
[ ; ]
Azure Synapse Analytics、Analytics Platform System (PDW)、Microsoft Fabric の場合の構文:
KILL 'session_id'
[ ; ]
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
session_id
終了するプロセスのセッション ID。 session_id
は、接続の作成時に各ユーザー接続に割り当てられる一意の int です。 セッション ID の値は、接続の間、接続に関連付けられます。 接続が終了すると、この整数値は解放され、新しい接続に再度割り当てることができます。
次のクエリを使用して、強制終了する session_id
を識別できます。
SELECT conn.session_id, host_name, program_name,
nt_domain, login_name, connect_time, last_request_end_time
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
ON sess.session_id = conn.session_id;
UOW
分散トランザクションの作業単位 ID (UOW) を識別します。 UOW は、sys.dm_tran_locks
動的管理ビューのrequest_owner_guid
列から取得できる GUID です。 UOW は、エラー ログや MS DTC モニターからも取得できます。 分散トランザクションの監視の詳細については、MS DTC のドキュメントを参照してください。
KILL <UOW>
を使用して、未解決の分散トランザクションを停止します。 これらのトランザクションは実際のセッション ID には関連付けられませんが、代わりにセッション ID = -2
に人為的に関連付けられます。 このセッション ID を使用すると、 sys.dm_tran_locks
、 sys.dm_exec_sessions
、または動的管理ビューのセッション ID 列に対してクエリを実行することで、未解決のトランザクション sys.dm_exec_requests
簡単に識別できます。
WITH STATUSONLY
指定したUOWまたは以前のKILL
ステートメントのためにロールバックされるsession_id
の進行状況レポートを生成するために使用します。 KILL WITH STATUSONLY
は、UOW またはセッション ID を終了またはロールバックしません。 このコマンドは、ロールバックの現在の進行状況のみを表示します。
WITH COMMIT
コミットを使用して未解決の分散トランザクションを強制終了するために使用されます。 分散トランザクションにのみ適用されます。このオプションを使用するには、UOW を指定する必要があります。 詳細については、「 分散トランザクション」を参照してください。
WITH ROLLBACK
ロールバックで未解決の分散トランザクションを強制終了するために使用されます。 分散トランザクションにのみ適用されます。このオプションを使用するには、UOW を指定する必要があります。 詳細については、「 分散トランザクション」を参照してください。
解説
KILL
は、ロックを使用して他の重要なプロセスをブロックしているプロセスを終了するために一般的に使用されます。 KILL
は、必要なシステム リソースを使用しているクエリを実行しているプロセスを停止するためにも使用できます。 システム プロセスと拡張ストアド プロシージャを実行しているプロセスは終了できません。
特に重要なプロセスが実行されている場合は、 KILL
慎重に使用してください。 ユーザー自身のプロセスは終了できません。 次のプロセスも、終了すべきではありません。
AWAITING COMMAND
CHECKPOINT SLEEP
LAZY WRITER
LOCK MONITOR
SIGNAL HANDLER
@@SPID
を使用して、現在のセッションのセッション ID 値を表示します。
アクティブなセッション 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>
または KILL <UOW>
ステートメントのためにセッション ID または UOW がロールバックされた場合にレポートを生成します。 進行状況レポートには、完了したロールバックの進行状況 (% 単位) と予想残り時間 (秒単位) が示されます。 レポートは、次の形式で示されます。
Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: <yy>% Estimated time left: <zz> seconds
KILL <session ID> WITH STATUSONLY
または KILL <UOW> WITH STATUSONLY
ステートメントが実行される前にセッション ID または UOW のロールバックが完了すると、KILL ... WITH STATUSONLY
は次のエラーを返します。
"Msg 6120, Level 16, State 1, Line 1"
"Status report cannot be obtained. Rollback operation for Process ID <session ID> is not in progress."
このエラーは、セッション ID または UOW がロールバックされていない場合にも発生します。
同じ状態レポートを取得するには、WITH STATUSONLY
オプションを使用せずに同じKILL
ステートメントを繰り返します。 ただし、このオプションをこの方法で繰り返すことはお勧めしません。 KILL <session_id>
ステートメントを繰り返すと、ロールバックが完了し、新しい KILL
ステートメントが実行される前にセッション ID が新しいタスクに再割り当てされると、新しいプロセスが停止する可能性があります。 WITH STATUSONLY
を指定して、新しいプロセスが停止しないようにします。
アクセス許可
SQL Server: には、 ALTER ANY CONNECTION
アクセス許可が必要です。 ALTER ANY CONNECTION
は、 sysadmin または processadmin 固定サーバー ロールのメンバーシップに含まれています。
SQL Database: には、 KILL DATABASE CONNECTION
アクセス許可が必要です。 サーバー レベルのプリンシパル ログインには、 KILL DATABASE CONNECTION
アクセス許可があります。
Microsoft Fabric: 管理者のアクセス許可が必要です。
Azure Synapse Analytics: 管理者アクセス許可が必要です。
例
A. KILL を使用してセッションを停止する
次の例は、セッション ID 53
を停止する方法を示しています。
KILL 53;
GO
B. KILL セッション ID WITH STATUSONLY を使用して進行状況レポートを取得する
次の例では、特定のセッション ID に対するロールバック プロセスの状態を取得します。
KILL 54;
KILL 54 WITH STATUSONLY;
GO
結果セットは次のようになります。
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.
C: KILL を使用して孤立した分散トランザクションを停止する
次の例は、D5499C66-E398-45CA-BF7E-DC9C194B48CF
の UOW で孤立した分散トランザクション (セッション ID = -2
) を停止する方法を示しています。
KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF';