KILL (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

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

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

Transact-SQL 语法约定

语法

适用于 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_guidsys.dm_tran_locks GUID。 也可以从错误日志中或通过 MS DTC 监视器获取 UOW。 有关监视分布式事务的详细信息,请参阅 MS DTC 文档。

用于 KILL <UOW> 停止未解析的分布式事务。 这些事务不与任何实际会话 ID 相关联,而是人为地与会话 ID = -2相关联。 通过此会话 ID,可以通过查询会话 sys.dm_tran_lockssys.dm_exec_sessionsID 列或sys.dm_exec_requests动态管理视图,更轻松地识别未解析的事务。

WITH STATUSONLY

用于为指定的 UOWsession_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_idsys.dm_tran_lockssys.dm_exec_sessions列以及sys.dm_exec_requests动态管理视图。 还可以查看 SPID 系统存储过程返回的 sp_who 列。 如果特定 SPID 正在进行回滚, cmd 则该 SPID 的结果集中的列 sp_who 表示 KILLED/ROLLBACK

当特定的连接在数据库资源上有锁并阻塞其他连接的进程时,blocking_session_idsys.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';