杀死Azure SQL DB会话

时间:2017-12-14 19:10:58

标签: azure-sql-database

我们正在将Azure SQL DB用于我们的云数据库解决方案。我们的一位开发人员在尝试执行一些插入语句时遇到了一些错误。我怀疑他又一次又一次地尝试了......

我运行以下查询以识别打开的会话,并查看我们的开发人员用于登录的用户的30个单独条目。是否值得杀死这些会话?或者我应该让他们一个人呆着?还有什么我应该评估的,告诉我我们的数据库是否有“挂起”会话?

SELECT   
c.session_id, c.net_transport, c.encrypt_option,   
c.auth_scheme, s.host_name, s.program_name,   
s.client_interface_name, s.login_name, s.nt_domain,   
s.nt_user_name, s.original_login_name, c.connect_time,   
s.login_time   
FROM sys.dm_exec_connections AS c  
JOIN sys.dm_exec_sessions AS s  
ON c.session_id = s.session_id  
WHERE 1=1
  and login_name = 'some_user_name'

2 个答案:

答案 0 :(得分:4)

我不建议在不知道他们先做什么的情况下杀死会话。

所以step1将是了解他们当前的状态..

select spid,blocked,waittime,waittype,lastwaittype,txt.text
 from sys.sysprocesses sp
 cross apply
 sys.dm_exec_sql_text(sp.sql_handle)  txt

上面的dmv给出了所有会话的状态,你可以看到它们是否被阻止,如果它们被阻止,你可以检查阻塞会话,并通过输入阻塞会话spid来尝试知道它被阻止的原因,如下所示

dbcc inputbuffer(blocking session spid)

有了这个,您可以尝试检查您遇到的挂起状态是否是由于阻塞。您可以尝试解决阻止或尝试杀死阻止spid

如果您没有看到任何阻止,但是如果认为这些会话已挂起,请尝试在dmv下运行以查看上次读取,写入状态。通过这种方式,您可以检查会话是否真的在做一些工作

 select last_read,
last_write,session_id,connect_time
 from sys.dm_exec_connections

在杀死会话之前尝试检查会话的内容(使用输入缓冲区。因为,有些可能是内部流程,如

SSISDB.internal.update_worker_agent_status;1

答案 1 :(得分:0)

你可以杀死它们。打开的交易将被回滚。下面的脚本可以帮助您杀死除您之外的所有连接。

DECLARE @kill varchar(8000) = '';

SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(5), c.session_id) + ';'

FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
WHERE c.session_id <> @@SPID
--WHERE status = 'sleeping'
ORDER BY c.connect_time ASC

EXEC(@kill)

添加要保留在WHERE子句上的其他会话。