在我们为 SQL 服务器进行常规操作系统修补后,我们遇到了一个奇怪的问题。
根据最佳实践,我们在被动上应用补丁并进行节点故障转移以使当前的被动、主动或反之亦然以完成修补。
通常,节点故障转移是无缝的,并在一分钟内完成。但是最近我们遇到了在节点故障转移后需要 4 分钟才能使 SQL 联机的问题:
我正在检查日志和事件,但找不到原因:以下是目前的发现:
注意:SQL 服务器在 VM 上运行
- SQL Server 活动没有增加
- 数据库是数据库镜像的一部分
- 在此期间不会增加用户连接或运行更长时间的用户查询
- 所有数据库的 VLF 低于 500
- 没有 CPU/内存压力并且启用了 LPIM。
- 似乎在故障转移期间长时间运行而被终止的进程是 EXEC sp_server_diagnostics 20 运行了过去 86745234 秒
请协助我还应该检查什么以找到根本原因?
编辑-我尝试分析集群日志并且可以看到 sql 离线已启动,但我不确定它在内部花费至少 4 分钟实际关闭 sql 并将其恢复。4 分钟后,sql 错误日志显示数据库的所有条目大约需要 10 秒。所以看起来 DB 可能没有任何参与来减慢进程。
编辑-当前检查时的一些 VLF 信息
您的问题很可能是由于数据库正在恢复以重做或撤消尚未强化到数据文件的事务。
一起避免恢复
在执行计划的服务器重启或 FCI 的故障转移之前,尤其是具有大量内存的 FCI ,我喜欢
CHECKPOINT
在每个数据库上运行一个。这最大限度地减少了完全关闭所有数据库所花费的时间,并且(当数据库没有完全关闭时)最大限度地减少重新启动时的崩溃恢复时间。我使用
sp_ineachdb
First Responder Kit执行此操作:如果你讨厌让你的生活更轻松的免费代码,你可以用动态 SQL 做一些事情:
但是通过减少工作来更快地恢复
当然,正如Erik,Darling在评论中提到的那样,确保您的 VLF 井井有条且大小合适。在崩溃恢复期间扫描这些 VLF 可能会给您带来您所看到的所有痛苦。对于计划内维护,您可以
CHECKPOINT
最大限度地减少或消除崩溃恢复。但是如果你有......呃......意外的崩溃和故障转移,那么崩溃恢复仍然会发生,而且你无能为力。不那么直接
我也有很多间接检查站的运气。我们已经在整个环境中推广了这一点,并取得了很大的成功。
并游说升级的权力
SQL Server 2019 包含一项名为Accelerated Database Recovery的功能,该功能可以加快恢复过程,尤其是在存在长时间运行的大型事务时。ADR 不仅用于崩溃后的恢复,还有助于其他需要恢复事务日志的场景——包括可用性组二级重做和故障转移集群实例故障转移。