为什么我的 RDS for SQL Server 实例卡在重启状态?

2 分钟阅读
0

为什么重启我的 Microsoft SQL Server 实例的 Amazon Relational Database Service (Amazon RDS) 需要很长时间?

简短描述

如果实例上有大量正在进行的事务,重启数据库实例可能需要比预期更多的时间。或者,如果实例上有大量虚拟日志文件(VLF)减慢重启速度,则重启可能会出现卡住。

要解决这些问题,请执行以下一项或两项操作:

  • 检查数据库实例上是否有正在进行的查询。
  • 减少数据库实例上的 VLF 数量。

解决方法

检查数据库实例上是否有正在进行的查询

重启会停止所有正在进行的事务,并且 SQL Server 会在启动实例时运行恢复。SQL Server 执行事务的前滚和回滚以使数据库处于一致状态。

您可以在 SQL Server 错误日志中看到此恢复过程所花费的时间。日志条目包括每个恢复阶段所消耗的时间。在以下日志条目示例中,X 是 SQL Server 在每个阶段和完全恢复中花费的时间。如果您有大量正在进行的事务,则重启可能需要很长时间。

Recovery completed for database <<DB_NAME>> (database ID <<id of database>>) in X second(s) (analysis X ms, redo X ms, undo X ms [system undo X ms, regular undo X ms].) This is an informational message only. No user action is required.

要解决此问题,请减少正在进行的查询数量。使用以下命令检查数据库上是否有任何活动的数据修改事务。

SELECT r.session_id,
       r.start_time,
       r.status,
       r.cpu_time,
       r.total_elapsed_time,
       st.TEXT AS batch_text
FROM sys.dm_exec_requests AS r
     CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
     CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
     where session_id <> @@SPID
ORDER BY cpu_time DESC;

命令输出提供有关数据库上运行的会话的信息以及开始时间和 SQL 文本。如果有查询仍在运行,则在执行重启之前允许查询完成。

减少数据库实例上的 VLF 数量

由于实例上的 VLF 数量很多,重启可能需要很长时间。过多的 VLF 可能会从最初以非常小的增量(手动或自动)增长的小型事务日志中累积。

在重启期间开始恢复阶段之前,SQL Server 会依次扫描所有 VLF。此阶段称为发现阶段。如果找到大量 VLF,则错误日志中会显示以下通知:

Database %ls has more than %d virtual log files which is excessive. Too many virtual log files can cause long startup and backup times. Consider shrinking the log and using a different growth increment to reduce the number of virtual log files.

要减少 VLF 的数量,请执行以下操作:

**注意:**最佳做法是在缓慢或非工作时间执行这些步骤。

  1. 以主用户身份从 Microsoft SQL Server Management Studio 登录 RDS for SQL Server 实例
  2. 运行 DBCC SQLPERF(LOGSPACE) 查询以检查日志文件利用率。
  3. 对于在错误日志中收到高 VLF 通知的数据库,压缩其日志文件
  4. 一次性将事务日志文件全部扩展到适当的使用大小。这样可以避免导致大量 VLF 的自动增长。

**注意:**压缩日志文件会减少 VLF 的数量。按照 VLF 创建标准,执行一次性扩展会创建有限数量的 VLF。有关更多信息,请参阅 Microsoft SQL 文档中的虚拟日志文件 (VLF)


相关信息

如何排查运行 SQL Server 的 Amazon RDS 数据库实例的存储消耗问题?

AWS 官方
AWS 官方已更新 2 年前