SQL Server终止阻塞会话及跨链接服务器执行Kill命令实现方案
实现跨链接服务器终止远程SQL Server会话的方案
核心逻辑:KILL命令无法直接跨链接服务器执行,需通过链接服务器调用目标实例的动态SQL执行接口完成远程命令下发。
前置条件
- 管控端到目标SQL Server的链接服务器(示例中命名为
[Target_Linked_Server])已配置正常联通 - 链接服务器使用的认证账号,在目标SQL Server实例上拥有
ALTER ANY CONNECTION权限(执行KILL命令的必备权限)
改造后可直接使用的脚本
DECLARE @TargetLinkedServer NVARCHAR(128) = N'[Target_Linked_Server]' -- 替换为你的链接服务器名称 DECLARE @tbl TABLE (sesid INT) DECLARE @n INT, @i INT = 0, @s INT, @killCommand NVARCHAR(20) = N'KILL ', @sql NVARCHAR(255), @RemoteExecSql NVARCHAR(500) -- 从远程链接服务器查询阻塞会话ID INSERT INTO @tbl(sesid) EXEC(' SELECT DISTINCT BlkBy FROM ( SELECT spid, blocked BlkBy, sd.name DBName FROM master.dbo.sysprocesses sp JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid ) AS tbl WHERE BlkBy <> 0 ') AT @TargetLinkedServer SELECT @n = COUNT(*) FROM @tbl WHILE @i < @n BEGIN SELECT TOP 1 @s = sesid FROM @tbl -- 构造远程执行的KILL命令 SET @sql = @killCommand + CAST(@s AS NVARCHAR(10)) SET @RemoteExecSql = N'EXEC sp_executesql N''' + REPLACE(@sql, '''', '''''') + N'''' -- 调用远程链接服务器执行命令 EXEC (@RemoteExecSql) AT @TargetLinkedServer DELETE FROM @tbl WHERE sesid = @s SET @i = @i + 1 END
注意事项
- 如果目标实例为SQL Server 2005及以上版本,建议将原查询中的
sysprocesses替换为更稳定的sys.dm_exec_sessions、sys.dm_tran_locks动态管理视图,查询阻塞会话的准确率更高 - 建议在脚本中增加会话过滤逻辑,避免误杀系统会话、运维操作会话
- 如需管控多台实例,只需遍历你的实例配置表,循环替换
@TargetLinkedServer变量的值即可批量执行
内容的提问来源于stack exchange,提问作者mothana
相关产品推荐
相关产品推荐

