為什麼我的 RDS for SQL Server 執行個體停留在重新啟動狀態?

上次更新日期:2022 年 9 月 27 日

為什麼需要很長時間才能為 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 登入 RRDS for SQL Server 執行個體
  2. 執行 DBCC SQLPERF(LOGSPACE) 查詢以檢查日誌檔使用率。
  3. 針對錯誤日誌中收到高 VLF 通知的資料庫壓縮日誌檔
  4. 一次將交易日誌檔展開為適當的使用大小。這可避免會導致大量 VLF 的自動成長。

備註:壓縮日誌檔可減少 VLF 的數目。執行一次性擴充會建立 VLF 建立準則所需的有限數量的 VLF。如需詳細資訊,請參閱 Microsoft SQL 文件中的虛擬日誌檔 (VLF)