Microsoft SQL Server インスタンス用の Amazon Relational Database Service (Amazon RDS) の再起動に時間がかかるのはなぜですか?
簡単な説明
インスタンスで進行中のトランザクションが大量にある場合、DB インスタンスの再起動には予想以上に時間がかかることがあります。または、インスタンスに多数の仮想ログファイル (VLF) があるために再起動が遅くなっている場合、再起動が停止しているように見えることがあります。
これらの問題を解決するには、次の操作のいずれか、または両方を実行してください。
- DB インスタンスで実行中のクエリを確認します。
- DB インスタンスの VLF の数を減らします。
解決方法
DB インスタンスで実行中のクエリを確認する
再起動すると、進行中のすべてのトランザクションが停止し、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 テキストとともに表示されます。まだ実行中のクエリがある場合は、再起動を実行する前にクエリを完了させます。
DB インスタンスの 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 の数が減ります。1 回限りの拡張を実行すると、VLF 作成基準に従って必要とされる限られた数の VLF が作成されます。詳細については、Microsoft SQL ドキュメントの「Virtual Log Files (VLFs)」(仮想ログファイル (VLF)) を参照してください。
関連情報
SQL Server を実行している Amazon RDS DB インスタンスのストレージ消費についてトラブルシューティングするにはどうすればよいですか?