KILL (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

セッション ID または作業単位 (UOW) に基づいてユーザーのプロセスを終了します。 指定されたセッション ID または UOW に元に戻す作業が多い場合、ステートメントの KILL 完了に時間がかかる場合があります。 特に、プロセスに長いトランザクションのロールバックが含まれている場合、このプロセスは完了するまで時間がかかります。

KILL は通常の接続を終了します。これは、指定されたセッション ID に関連付けられているトランザクションを内部的に停止します。 Microsoft 分散トランザクション コーディネーター (MS DTC) が使用されることがあります。 MS DTC が使用されている場合も、このステートメントを使用して、孤立している分散トランザクションと疑いのある分散トランザクションを終了できます。

Transact-SQL 構文表記規則

構文

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 は、動的管理ビューのrequest_owner_guidsys.dm_tran_locks列から取得できる GUID です。 UOW は、エラー ログや MS DTC モニターからも取得できます。 分散トランザクションの監視の詳細については、MS DTC のドキュメントを参照してください。

未解決の分散トランザクションを停止するために使用 KILL <UOW> します。 これらのトランザクションは実際のセッション ID には関連付けられませんが、代わりにセッション ID = -2に人為的に関連付けられます。 このセッション ID を使用すると、セッション ID 列 (動的管理ビュー) sys.dm_exec_requests に対してクエリを実行することで、未解決のトランザクションを簡単にsys.dm_tran_lockssys.dm_exec_sessions識別できます。

WITH STATUSONLY

指定した UOW の進行状況レポート、または session_id 以前 KILL のステートメントのためにロールバックされる進行状況レポートを生成するために使用します。 KILL WITH STATUSONLY は、UOW またはセッション ID を終了またはロールバックしません。 このコマンドは、ロールバックの現在の進行状況のみを表示します。

WITH COMMIT

コミットを使用して未解決の分散トランザクションを強制終了するために使用されます。 分散トランザクションにのみ適用されます。このオプションを使用するには、UOW を指定する必要があります。 詳細については、分散トランザクションを参照してください

WITH ROLLBACK

ロールバックで未解決の分散トランザクションを強制終了するために使用されます。 分散トランザクションにのみ適用されます。このオプションを使用するには、UOW を指定する必要があります。 詳細については、分散トランザクションを参照してください

解説

KILL は、ロックを使用して他の重要なプロセスをブロックしているプロセスを終了するために一般的に使用されます。 KILL は、必要なシステム リソースを使用しているクエリを実行しているプロセスを停止するためにも使用できます。 システム プロセスと拡張ストアド プロシージャを実行しているプロセスは終了できません。

特に重要なプロセスが実行されている場合は、慎重に使用 KILL してください。 ユーザー自身のプロセスは終了できません。 次のプロセスも、終了すべきではありません。

  • AWAITING COMMAND
  • CHECKPOINT SLEEP
  • LAZY WRITER
  • LOCK MONITOR
  • SIGNAL HANDLER

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

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

特定の接続がデータベース リソースをロックして別の接続の進行を妨げている場合、sys.dm_exec_requestsblocking_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 <UOW> WITH STATUSONLYステートメントが実行される前にセッション ID または UOW のロールバックがKILL <session ID> WITH STATUSONLY完了すると、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 がロールバックされていない場合にも発生します。

オプションを使用せずに同じステートメントを繰り返すことで、同じ KILL 状態レポートを WITH STATUSONLY 取得できます。 ただし、このオプションをこの方法で繰り返すことはお勧めしません。 ステートメントを KILL <session_id> 繰り返すと、ロールバックが完了し、新しいステートメントが実行される前にセッション ID が新しいタスクに再割り当てされると、新しい KILL プロセスが停止する可能性があります。 を指定して、新しいプロセスが停止しないようにします WITH STATUSONLY

アクセス許可

SQL Server: アクセス許可が必要です ALTER ANY CONNECTIONALTER 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 を使用して孤立した分散トランザクションを停止する

次の例は、UOW D5499C66-E398-45CA-BF7E-DC9C194B48CF が . の孤立分散トランザクション (セッション ID = -2) を停止する方法を示しています。

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