为什么重启我的 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 的数量,请执行以下操作:
**注意:**最佳做法是在缓慢或非工作时间执行这些步骤。
- 以主用户身份从 Microsoft SQL Server Management Studio 登录 RDS for SQL Server 实例。
- 运行 DBCC SQLPERF(LOGSPACE) 查询以检查日志文件利用率。
- 对于在错误日志中收到高 VLF 通知的数据库,压缩其日志文件。
- 一次性将事务日志文件全部扩展到适当的使用大小。这样可以避免导致大量 VLF 的自动增长。
**注意:**压缩日志文件会减少 VLF 的数量。按照 VLF 创建标准,执行一次性扩展会创建有限数量的 VLF。有关更多信息,请参阅 Microsoft SQL 文档中的虚拟日志文件 (VLF)。
相关信息
如何排查运行 SQL Server 的 Amazon RDS 数据库实例的存储消耗问题?