KILL (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics 是并行数据仓库

结束基于会话 ID 或工作单元 (UOW) 的用户进程。 如果指定的会话 ID 或 UOW 有许多工作要撤消,KILL 语句可能需要一段时间才能完成。 此过程可能需要更长时间才能完成,特别是在进程涉及回滚长事务时。

KILL 结束正常连接,这会在内部停止与指定会话 ID 关联的事务。 有时,可能会使用 Microsoft 分布式事务处理协调器 (MS DTC)。 如果使用 MS DTC,也可以使用此语句来结束孤立的未决分布式事务。

主题链接图标 Transact-SQL 语法约定

语法

-- Syntax for SQL Server  
  
KILL { session ID [ WITH STATUSONLY ] | UOW [ WITH STATUSONLY | COMMIT | ROLLBACK ] }    

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
KILL 'session_id'  
[;]   

备注

若要查看 SQL Server 2014 及更早版本的 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。 也可以从错误日志中或通过 MS DTC 监视器获取 UOW。 有关监视分布式事务的详细信息,请参阅 MS DTC 文档。

使用 KILL <UOW> 可停止未解析的分布式事务。 这些事务不与任何实际会话 ID 相关联,但与会话 ID =“-2”虚拟关联。 此会话 ID 可使标识未解析的事务变得更为简单,其方法是查询 sys.dm_tran_locks sys.dm_exec_sessionssys.dm_exec_requests 动态管理视图中的会话 ID 列。

WITH STATUSONLY
用于生成由于更早的 KILL 语句而正在回滚的指定 UOW 或 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 可显示当前会话的 session 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。

当特定的连接在数据库资源上有锁并阻塞其他连接的进程时,blocking_session_idsys.dm_exec_requests 列或 blk 返回的 sp_who 列中将显示该阻塞连接的会话 ID。

KILL 命令可用于解决有疑问的分布式事务。 这些事务是未解决的分布式事务,它们是由于无计划地重新启动数据库服务器或 MS DTC 协调器而产生的。 有关未决事务的详细信息,请参阅使用标记的事务一致地恢复相关的数据库的事务(完全恢复模式)中的“两阶段提交”一节。

使用 WITH STATUSONLY

如果会话 ID 或 UOW 由于前面的 KILL session ID|UOW 语句而回滚,KILL WITH STATUSONLY 生成报告。 进度报告指出已完成的回滚量(以百分比形式)和估计的剩余时间(以秒为单位)。 报告使用以下格式声明它:

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

如果在 KILL session ID|UOW WITH STATUSONLY 语句运行前会话 ID 或 UOW 的回滚就已完成,那么 KILL session ID|UOW 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 session ID|UOW 语句,可以获得相同的状态报告。 不过,不建议这样重复使用选项。 如果在新的 KILL 语句运行前回滚就已完成且会话 ID 已重新分配给新任务,那么重复 KILL session ID 语句可能会停止新进程。 通过指定 WITH STATUSONLY 来阻止新进程停止。

权限

SQL Server: 要求具有 ALTER ANY CONNECTION 权限。 ALTER ANY CONNECTION 包括在 sysadmin 或 processadmin 固定服务器角色的成员身份中。

SQL 数据库: 需要具有 KILL DATABASE CONNECTION 权限。 服务器级别主体登录名具有 KILL DATABASE CONNECTION。

示例

A. 使用 KILL 停止会话

下面的示例展示了如何停止会话 ID 53

KILL 53;  
GO  

B. 使用 KILL session 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 停止孤立的分布式事务

下面的示例展示了如何停止孤立的分布式事务(会话 ID = -2),其中 UOW 为 D5499C66-E398-45CA-BF7E-DC9C194B48CF

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

另请参阅

KILL STATS JOB (Transact-SQL)
KILL QUERY NOTIFICATION SUBSCRIPTION (Transact-SQL)
内置函数 (Transact-SQL)
SHUTDOWN (Transact-SQL)
@@SPID (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_sessions (Transact-SQL)
sys.dm_tran_locks (Transact-SQL)
sp_lock (Transact-SQL)
sp_who (Transact-SQL)