次の方法で共有


KILL (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database

セッション 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'
[ ; ]

引数

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_lockssys.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_lockssys.dm_exec_sessions、およびsys.dm_exec_requestssession_id列に対してクエリを実行します。 sp_who システム ストアド プロシージャが返すSPID列を表示することもできます。 特定の SPID に対してロールバックが進行中の場合、その SPID のsp_who結果セットのcmd列はKILLED/ROLLBACKを示します。

特定の接続がデータベース リソースをロックして別の接続の進行を妨げている場合、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 <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-DC9C194B48CFUOW で孤立した分散トランザクション (セッション ID = -2) を停止する方法を示しています。

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