我如何找出为什么 azure SQL 数据库定期 restarting/resetting?

How can I find out why azure SQL Database is restarting/resetting periodically?

在过去一两周内,我们看到了四种情况,其中我们的 Azure SQL 数据库 DTU 图最终看起来像这样:

也就是说,它似乎 "restart"(请注意,该图在峰值之前始终显示 0 个 DTU,这绝对不是这种情况,因为我们在该服务器上有持续的流量)。这似乎表明 DTU 测量重新开始。大峰值以及随后衰减和稳定的 DTU 值似乎向我们表明数据库是 "warming up"(大概是在做填充缓存和组织索引之类的事情?)。访问此数据库的 Web 应用程序的流量在同一时间段内没有任何异常,因此我们没有任何理由认为这是 "high load".

的结果

Azure 中的 "Activity Log" 项目不显示任何信息。然而,查看我们数据库的 "Resource Health",我们看到以下内容:

请注意您的 SQL 数据库的问题已解决。然而,时间戳并不完全对应于上面的尖峰时间(图表显示的是 UTC+1 时间,并且大概资源健康时间戳是 UTC,所以大约有 1.15 小时的差异)。

点击 "View History" 可以看到过去几周的所有此类事件:

在每种情况下,数据库在刷新粒度(2 分钟)内再次 "available",再次建议重新启动。有趣的是,在每种情况下重新启动大约相隔 4 天。

当然,我希望并理解数据库会不时移动和重新启动。我们的网络应用程序是 Asp.Net Core 2.0 并使用连接弹性,因此我们没有任何失败的请求。

也就是说,考虑到过去几周这种情况发生得比较频繁,我当然想知道这是否需要我们采取行动。例如,我们确实在 5 周前升级到 Entity Framework Core 2.0,所以我有点担心这可能与此有关。

我的问题:

数据库处于 S3 标准级别(100 个 DTU),托管在东南亚。它的大小约为 3.5GB。

请启用查询存储以识别您在 DTU 消耗图上看到的那些峰值所涉及的查询和语句。

ALTER DATABASE [DB1] SET QUERY_STORE = ON;

然后使用类似下面的查询来识别长 运行 查询及其涉及的表。表格的名称可能会让您了解是什么造成了这些尖峰。

SELECT TOP 10 rs.avg_duration, qt.query_sql_text, q.query_id,  
    qt.query_text_id, p.plan_id, GETUTCDATE() AS CurrentUTCTime,   
    rs.last_execution_time   
FROM sys.query_store_query_text AS qt   
JOIN sys.query_store_query AS q   
    ON qt.query_text_id = q.query_text_id   
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.query_id   
JOIN sys.query_store_runtime_stats AS rs   
    ON p.plan_id = rs.plan_id  
WHERE rs.last_execution_time > DATEADD(hour, -1, GETUTCDATE())  
ORDER BY rs.avg_duration DESC;

关于 Resource Health 上记录的停机时间,似乎与维护任务有关,因为它们每 4 天发生一次,但我会向 SQL Azure 团队报告并尝试获得反馈。