KILL (Transact-SQL)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库
结束基于会话 ID 或工作单元 (UOW) 的用户进程。 如果指定的会话 ID 或 UOW 有很多工作要撤消,则 KILL
语句可能需要一些时间才能完成。 此过程可能需要更长时间才能完成,特别是在进程涉及回滚长事务时。
KILL
结束正常连接,该连接在内部停止与指定会话 ID 关联的事务。 有时,可能会使用 Microsoft 分布式事务处理协调器 (MS DTC)。 如果使用 MS DTC,也可以使用此语句来结束孤立的未决分布式事务。
语法
适用于 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例的语法:
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 是从动态管理视图的列获取 request_owner_guid
的 sys.dm_tran_locks
GUID。 也可以从错误日志中或通过 MS DTC 监视器获取 UOW。 有关监视分布式事务的详细信息,请参阅 MS DTC 文档。
用于 KILL <UOW>
停止未解析的分布式事务。 这些事务不与任何实际会话 ID 相关联,而是人为地与会话 ID = -2
相关联。 通过此会话 ID,可以通过查询会话 sys.dm_tran_locks
sys.dm_exec_sessions
ID 列或sys.dm_exec_requests
动态管理视图,更轻松地识别未解析的事务。
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
用于 @@SPID
显示当前会话的会话 ID 值。
若要获取活动会话 ID 值的报表,请查询session_id
sys.dm_tran_locks
sys.dm_exec_sessions
列以及sys.dm_exec_requests
动态管理视图。 还可以查看 SPID
系统存储过程返回的 sp_who
列。 如果特定 SPID 正在进行回滚, cmd
则该 SPID 的结果集中的列 sp_who
表示 KILLED/ROLLBACK
。
当特定的连接在数据库资源上有锁并阻塞其他连接的进程时,blocking_session_id
的 sys.dm_exec_requests
列或 blk
返回的 sp_who
列中将显示该阻塞连接的会话 ID。
该 KILL
命令可用于解决不确定的分布式事务。 这些事务是未解决的分布式事务,它们是由于无计划地重新启动数据库服务器或 MS DTC 协调器而产生的。 有关可疑事务的详细信息,请参阅“使用标记的事务一致恢复相关数据库的”两阶段提交“部分。
使用 WITH STATUSONLY
KILL WITH STATUSONLY
如果会话 ID 或 UOW 由于以前的 KILL <session ID>
或 KILL <UOW>
语句而回滚,则生成报告。 进度报告指出已完成的回滚量(以百分比形式)和估计的剩余时间(以秒为单位)。 报告使用以下格式声明它:
Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: <yy>% Estimated time left: <zz> seconds
如果会话 ID 或 UOW 的回滚在或KILL <UOW> WITH STATUSONLY
语句运行之前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,也会出现此错误。
可以通过重复相同的语句而不使用WITH STATUSONLY
选项来获取相同的KILL
状态报告。 不过,不建议这样重复使用选项。 如果重复语句 KILL <session_id>
,则在回滚完成并且会话 ID 在新语句运行之前 KILL
重新分配给新任务,则新进程可能会停止。 通过指定 WITH STATUSONLY
来阻止新进程停止。
权限
SQL Server: 需要 ALTER ANY CONNECTION
权限。 ALTER ANY CONNECTION
包含在 sysadmin 或 processadmin 固定服务器角色的成员身份中。
SQL 数据库:需要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';