如果无法访问 Azure SQL 数据库,如何终止与它的连接?

How do I kill connections to Azure SQL database if I can't access it?

今天我们迁移到了 AzureSQL V12。今晚我的网站离线,因为以下消息一直存在问题:

Resource ID : 3. The LoginLimit limit for the database is 90 and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. (Microsoft SQL Server, Error: 10928)

我试过以下方法:

  1. 重新启动了我网站的服务器(也尝试了 iisreset 并重新启动了网络应用程序)
  2. 删除了 Azure 门户中的所有 IP 筛选器(包括从 Azure 服务访问)
  3. 升级到 Azure 中的下一层(它卡在 "In Progress" 上并且没有改变,所以我猜连接阻碍了升级)

我无法通过 SSMS 连接到我的数据库。我收到相同的错误消息。这已经持续了几个小时了,我的网站完全离线了,但登录次数没有变化。

我需要一些方法来断开其中一些连接,以便我可以继续诊断问题所在。

您可以在前提下使用类似于 sql 的 DAC 管理连接,并在 运行 会话结束时终止连接。你可以在@http://www.sqlindepth.com/2015/05/diagnostic-connections-to-sql-db-v12-databases/

找到详情

如果那些连接仍然挂起并且没有超时,你可以使用 t-sql KILL 命令来杀死它们。

另一种选择是使用 DAC。在 MSDN 上查看详细信息。

如果 none 这些选项有帮助,请通过电子邮件将您的服务器和数据库的详细信息发送给我,我可以提供帮助。

这里还有一个鲜为人知的选项,该限制取决于您所在的层级(S1、S2、P1 等),因此您可以提升一个层级以获得更高的登录量,这可能会允许您解决问题。

经常向上移动这样的层也会移动你所在的节点,这也会删除错误的登录。

要查看 Azure SQL 数据库上的现有连接,我使用此查询:

SELECT
    c.session_id, c.net_transport, c.encrypt_option,
    s.status,
    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 c.session_id = @@SPID;
--WHERE status = 'sleeping'
ORDER BY c.connect_time ASC

要杀死除我的 (SPID) 之外的所有连接,我使用此查询:

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)

此问题是由于 Azure 自动备份未能正确结束会话引起的。 None 其他答案有效,因为它们都要求您能够连接到数据库,而我无法做到这一点。我最终在 phone 上与 Microsoft 支持人员交谈了几个小时,在此期间他们也出于同样的原因无法连接到数据库。

从他们的角度来看,解决方案是将数据库迁移到新节点,这不是 Azure 用户可以做的事情,所以如果您遇到这种级别的问题,最好(也是唯一)的事情是要做的是尽快联系 Microsoft 支持。

我确实建议先尝试这里的一些其他建议,但如果无法建立任何联系,您将被卡住。

因为这是在Azure上升级数据库的过程中发生的,我们在升级数据库之前实施了一个禁用自动备份的过程作为预防措施,我们没有再出现这个问题。