RDS for SQL Serverでトランザクションログの使用率を確認する方法
公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13
結論
トランザクションログの使用率は、インスタンス全体なら `DBCC SQLPERF(LOGSPACE)`、対象データベースなら `sys.dm_db_log_space_usage`(SQL Server 2012 以降)で確認します。使用率が下がらない場合は `sys.databases` の `log_reuse_wait_desc` を見てください。ログが再利用されない理由がこの1列に出ます。確認用SQLはすべて参照専用で、Amazon RDS でも実行できます。
この文書の適用条件
| 対象製品 | SQL Server / Amazon RDS for SQL Server / Azure SQL Managed Instance |
|---|---|
| 確認バージョン | SQL Server 2008 以降(`sys.dm_db_log_space_usage` は SQL Server 2012 以降) |
| 適用環境 | オンプレミス、EC2、Amazon RDS、Azure |
| 必要権限 | `DBCC SQLPERF(LOGSPACE)` と `sys.dm_db_log_space_usage` は VIEW SERVER STATE。`sys.databases` はメタデータ可視性ルールに従う |
| 実行影響 | 参照のみ(データ・設定・ログの内容を変更しません) |
| 再起動 | 不要 |
| 最終検証日 | 2026-08-13 |
そのまま実行できるコマンド
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- VIEW SERVER STATE
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: VIEW SERVER STATE
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
DBCC SQLPERF(LOGSPACE);インスタンス上の全データベースについて、ログファイルのサイズ(MB)と使用率(%)を1行ずつ返します。まずこれで「どのデータベースのログが埋まっているか」を特定します。
- 対象
- SQL Server 2012 以降 / Amazon RDS for SQL Server
- 権限
- VIEW SERVER STATE
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2012 以降 / Amazon RDS for SQL Server
-- 権限: VIEW SERVER STATE
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
USE [SampleDB];
GO
SELECT
DB_NAME(database_id) AS database_name,
total_log_size_in_bytes / 1024 / 1024 AS total_log_size_mb,
used_log_space_in_bytes / 1024 / 1024 AS used_log_space_mb,
used_log_space_in_percent AS used_log_space_pct,
log_space_in_bytes_since_last_backup / 1024 / 1024 AS log_since_last_backup_mb
FROM sys.dm_db_log_space_usage;この動的管理ビューは接続中のデータベース1件だけを返します。複数データベースを見るときは `USE` を切り替えるか、先に `DBCC SQLPERF(LOGSPACE)` で全体像を取ってください。`log_space_in_bytes_since_last_backup` は、最後のログバックアップ以降に生成されたログ量です。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- `sys.databases` のメタデータ可視性(VIEW ANY DATABASE 相当)
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: sys.databases のメタデータ可視性
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
d.name AS database_name,
d.state_desc AS database_state,
d.recovery_model_desc AS recovery_model,
d.log_reuse_wait AS log_reuse_wait_id,
d.log_reuse_wait_desc AS log_reuse_wait_desc,
d.is_cdc_enabled AS is_cdc_enabled,
d.is_published AS is_published,
d.is_subscribed AS is_subscribed
FROM sys.databases AS d
WHERE d.database_id > 4 -- システムデータベースを除外
ORDER BY d.name;この記事で最も重要な列です。主な値の意味は次のとおりです。NOTHING=再利用を妨げる要因なし。CHECKPOINT=チェックポイント未完了(通常は一時的)。LOG_BACKUP=完全/一括ログ復旧モデルでログバックアップ待ち。ACTIVE_TRANSACTION=開いたままのトランザクションがある。REPLICATION=トランザクションレプリケーションまたはCDCが未読のログを保持している。AVAILABILITY_REPLICA=可用性グループのセカンダリへの同期が遅れている。DATABASE_MIRRORING=ミラーリングが一時停止または遅延している。ACTIVE_BACKUP_OR_RESTORE=バックアップ/復元が実行中。このほか DATABASE_SNAPSHOT_CREATION、LOG_SCAN、OLDEST_PAGE、XTP_CHECKPOINT などが返ることがあります。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- 対象DBへの接続権限
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: 対象DBへの接続権限
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
USE [SampleDB];
GO
SELECT
DB_NAME() AS database_name,
f.file_id,
f.name AS logical_name,
f.type_desc,
f.size * 8 / 1024 AS current_size_mb,
CASE
WHEN f.max_size IN (-1, 268435456) THEN NULL -- 無制限扱い
ELSE f.max_size * 8 / 1024
END AS max_size_mb,
CASE
WHEN f.is_percent_growth = 1 THEN CAST(f.growth AS varchar(10)) + ' %'
ELSE CAST(f.growth * 8 / 1024 AS varchar(10)) + ' MB'
END AS autogrowth,
(f.size - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS bigint)) * 8 / 1024 AS free_space_mb
FROM sys.database_files AS f
WHERE f.type_desc = 'LOG';ログファイルの `max_size` が -1(または 268435456)の場合は上限なしとして扱われます。自動拡張が「% 指定」になっていると、ファイルが大きくなるほど1回の拡張量が跳ね上がるため、固定MB指定が扱いやすくなります。
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| Database Name | `DBCC SQLPERF(LOGSPACE)` が返すデータベース名 | どのデータベースのログが埋まっているかを特定する |
| Log Size (MB) | ログファイルの現在サイズ | 想定より大きい場合、過去に自動拡張が繰り返されている |
| Log Space Used (%) | ログの使用率 | 継続的に高い、または下がらない場合は `log_reuse_wait_desc` を確認する |
| used_log_space_in_percent | `sys.dm_db_log_space_usage` が返す使用率 | 数分間隔で取得し、下がるかどうかを見る。下がらないなら解放が阻害されている |
| log_space_in_bytes_since_last_backup | 最後のログバックアップ以降に生成されたログ量 | 増え続けている場合はログバックアップが行われていない可能性がある |
| recovery_model_desc | 復旧モデル(FULL / BULK_LOGGED / SIMPLE) | FULL なのにログバックアップが無ければログは解放されない |
| log_reuse_wait_desc | ログを再利用できない理由 | NOTHING 以外が継続して出ていれば、その値が根本原因を示す |
| is_cdc_enabled / is_published | CDC・レプリケーションの有効状態 | `log_reuse_wait_desc = REPLICATION` のとき、どちらが原因かを切り分ける材料になる |
こういう状況で使います
- ログファイルだけが増え続け、ストレージの空きが減っていく
- エラー 9002「データベースのトランザクション ログがいっぱいです」で書き込みが失敗する
- ログを縮小してもすぐに元のサイズまで戻る
- Amazon RDS で自動バックアップを設定しているのに、ログ使用率が下がらない
考えられる原因(可能性の高い順)
01
復旧モデルが FULL なのにログバックアップが行われていない(LOG_BACKUP)
完全復旧モデルでは、ログバックアップを取るまでログ領域が再利用されません。復旧モデルを FULL にしただけでログバックアップの運用が無い状態が、この症状の最も一般的な原因です。
02
長時間開いたままのトランザクションがある(ACTIVE_TRANSACTION)
最も古い未コミットトランザクションより後ろのログは切り捨てできません。アプリケーションが `BEGIN TRAN` のまま放置している、バッチが異常終了してロールバック中、といったケースが該当します。
03
レプリケーションまたは CDC が未読のログを保持している(REPLICATION)
トランザクションレプリケーションのログリーダーエージェント、または CDC のキャプチャジョブが停止していると、まだ読み取っていないログが解放されずに残ります。
04
可用性グループ/ミラーリングの同期遅延(AVAILABILITY_REPLICA / DATABASE_MIRRORING)
セカンダリへ送信済みかつ適用済みになるまでログは保持されます。セカンダリの停止やネットワーク遅延でログが溜まります。
05
長時間のバックアップ・復元が実行中(ACTIVE_BACKUP_OR_RESTORE)
大容量データベースのバックアップ中はログが切り捨てられません。バックアップ完了後に解消するかを確認します。
06
単一トランザクションでの大量更新
数千万行の一括削除・更新を1トランザクションで実行すると、コミットするまでその分のログが必要です。ログサイズはトランザクション単位の設計に依存します。
確認手順
- 1
全データベースのログ使用率を取得する
参照のみ`DBCC SQLPERF(LOGSPACE)` を実行し、使用率の高いデータベースを特定します。
- 2
`log_reuse_wait_desc` を確認する
参照のみ`sys.databases` を参照し、値が NOTHING 以外で継続しているかを見ます。ここで原因の分類がほぼ決まります。
- 3
復旧モデルとログバックアップの有無を突き合わせる
参照のみ`recovery_model_desc` が FULL の場合、`msdb.dbo.backupset` を `type = 'L'`(ログバックアップ)で絞り、直近のログバックアップ時刻を確認します。
- 4
開いたままのトランザクションを探す
参照のみ`log_reuse_wait_desc = ACTIVE_TRANSACTION` の場合は、`sys.dm_tran_active_transactions` などで最古のトランザクションを特定します。
- 5
CDC・レプリケーションの状態を確認する
参照のみ`log_reuse_wait_desc = REPLICATION` の場合は、CDC キャプチャジョブとログリーダーエージェントの稼働状態を確認します。
- 6
数分間隔で再取得して推移を見る
参照のみ一時的な CHECKPOINT や LOG_SCAN であれば、次回取得時には NOTHING に戻ります。1回の値だけで判断しないでください。
対応方法
すぐに実施できる低リスクの対応
原因側を先に解消する
低`log_reuse_wait_desc` が示す要因(開いたトランザクション、停止したCDCジョブ、遅延しているセカンダリ)を解消すると、次のログ切り捨てで使用率が下がります。ファイル操作より先に行う対応です。
ログバックアップの実施状況を確認する
参照のみオンプレミス・EC2 の場合はログバックアップジョブの成否を確認します。Amazon RDS ではバックアップは RDS 側が管理するため、バックアップ保持期間の設定と復旧モデルが整合しているかを確認します。
空き容量を一時的に確保する
中書き込みが止まっている緊急時は、ログファイルの自動拡張上限やディスクの空きを確認し、必要ならログファイルの最大サイズ・拡張設定を見直します。設定変更はファイルサイズに影響します。
事前検討が必要な変更
大量更新をバッチ分割する
低一括削除・更新を数千〜数万行単位のトランザクションに分割し、こまめにコミットします。1トランザクションが保持するログ量を抑えられます。
自動拡張設定を見直す
中% 指定を固定MB指定に変え、想定ピークを吸収できる初期サイズを設定します。拡張回数が減ると仮想ログファイル(VLF)の断片化も抑えられます。
復旧モデルを業務要件と揃える
高「任意の時点への復旧」が不要なら SIMPLE も選択肢です。ただし SIMPLE では時点復旧ができなくなるため、業務側の合意が必須です。Amazon RDS では自動バックアップとの整合も確認してください。
ログ使用率を常時監視する
参照のみ使用率と `log_reuse_wait_desc` を定期取得し、NOTHING 以外が一定時間続いたら通知する仕組みを用意します。
再起動・サービス影響を伴う変更
ログファイルの縮小
高原因を解消したうえで、肥大化した分を戻す目的でのみ実施します。原因が残ったまま縮小しても再び拡張し、拡張のたびに書き込みが待たされます。手順と注意点は関連文書を参照してください。
開いたままのセッションの強制終了
高`KILL` は未コミットのトランザクションをロールバックします。ロールバックにも時間とログが必要で、影響範囲の確認と業務側の承認が前提です。
!注意事項
- Amazon RDS for SQL Server では、バックアップは RDS が管理します。ユーザーが `BACKUP LOG` を直接実行する運用は想定されていないため、ログバックアップの実施状況はバックアップ保持期間の設定と復旧モデルの整合性として確認してください。実行可否と挙動はエンジンバージョン・オプションにより異なるため、必ず対象環境で確認します。
- `log_reuse_wait_desc` が NOTHING 以外でも、CHECKPOINT や LOG_SCAN は一時的な値です。1回の取得結果だけで障害と判断しないでください。
- 復旧モデルを FULL から SIMPLE に変更すると、ログチェーンが切れて任意の時点への復旧ができなくなります。戻す際は完全バックアップの取り直しが必要です。
- ログの空き容量を作る目的でファイルを縮小しても、原因が残っていれば再拡張します。縮小は原因解消の代替になりません。
- エラー 9002 が発生している状態では書き込みトランザクションが失敗します。原因調査と並行して、業務影響の連絡を先に行ってください。
バージョン・環境による違い
これで解決しない場合に確認すること
最古のトランザクションの開始時刻
`ACTIVE_TRANSACTION` が続く場合、どのセッションがいつからトランザクションを開いているかを特定します。
CDC キャプチャジョブとログリーダーの稼働状態
`REPLICATION` が続く場合、キャプチャ側が止まっていないか、配布データベース側で滞留していないかを確認します。
仮想ログファイル(VLF)の数
`DBCC LOGINFO`(バージョンにより `sys.dm_db_log_info`)で VLF 数を確認します。数が極端に多い場合、復旧やログ処理が遅くなります。
ストレージ側の空き容量とIOPS
ログ拡張が失敗している場合、原因がデータベースではなくストレージ側であることがあります。
この文書の根拠と限界
製品の公式ドキュメントに基づく説明
SQL Server の `DBCC SQLPERF(LOGSPACE)`、`sys.dm_db_log_space_usage`、`sys.databases`(`log_reuse_wait_desc`)、`sys.database_files` の公開仕様に基づく一般的な確認手順です。Amazon RDS 固有の挙動は環境やエンジンバージョンによって差があるため、対象環境での確認を前提に記述しています。
よくある質問
Productionで実行できますか?
この記事に掲載した4つのSQLはいずれも参照専用で、データも設定も変更しません。本番環境でそのまま実行できます。ログファイルの縮小や復旧モデルの変更は別の作業であり、そちらは事前の影響確認が必要です。
AWS RDSでも使用できますか?
使用できます。`DBCC SQLPERF(LOGSPACE)`、`sys.dm_db_log_space_usage`、`sys.databases` はいずれも Amazon RDS for SQL Server で参照できます。ただし `BACKUP LOG` を直接実行する運用は RDS では想定されていないため、ログバックアップの状況はバックアップ保持期間の設定側で確認してください。
どの権限が必要ですか?
`DBCC SQLPERF(LOGSPACE)` と `sys.dm_db_log_space_usage` には VIEW SERVER STATE が必要です。`sys.databases` はメタデータ可視性ルールに従うため、権限のないデータベースは結果に現れません。
ログを縮小すれば解決しますか?
いいえ。縮小はサイズを戻すだけで、ログが解放されない原因には作用しません。`log_reuse_wait_desc` が示す要因を解消しない限り、縮小してもログは再び拡張します。
FULLとSIMPLEはどちらを選ぶべきですか?
業務要件で決まります。障害時に任意の時点まで戻す必要があるなら FULL とログバックアップの運用がセットで必要です。日次バックアップ時点まで戻せれば足りるなら SIMPLE も選択肢ですが、時点復旧ができなくなる点について業務側の合意が必要です。
結果をどう判断しますか?
使用率が高いこと自体は異常ではありません。数分間隔で取得して使用率が下がらず、かつ `log_reuse_wait_desc` が NOTHING 以外で固定されている場合に、その値が示す要因を調査対象とします。
この文書がカバーする質問
- SQL Serverのトランザクションログが減らない原因を知りたい
- log_reuse_wait_desc の値の意味を調べたい
- RDS for SQL Server でログバックアップはどうなっているのか
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
ログ使用率の確認そのものは、上記のSQLを1回実行するだけで終わります。難しいのは、複数インスタンスに対してこれを継続的に行い、`log_reuse_wait_desc` が NOTHING 以外に変わった瞬間を捉えることです。GIIP では AWS・Azure 上の複数データベースを対象に、AIエージェントが定期的に状態を取得し、閾値を超えた変化だけを人間の担当者に上げる運用を行っています。ログ肥大化のように「気付いた時には書き込みが止まっている」種類の事象は、値そのものより変化の検知が対応時間を左右します。
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
DBCC SHRINKDATABASEとDBCC SHRINKFILEの違いと実行前に確認すること
データベース全体を対象にする SHRINKDATABASE と、ファイル単位の SHRINKFILE の違い、TRUNCATEONLY の使いどころ、実行前に確認すべき項目を整理します。
sql-serverSQL Serverで長時間開いたままのトランザクションを確認するSQL
sys.dm_tran_active_transactions 系のDMVで、開始時刻・セッション・最後に実行したSQLまで含めて放置トランザクションを特定する手順です。
sql-serverSQL ServerのCDCでログスキャンが止まっていないか確認する方法
sys.dm_cdc_log_scan_sessions と cdc.lsn_time_mapping、キャプチャジョブの状態から、CDCのログスキャンが進んでいるかを確認する手順です。
sql-serverSQL ServerでMSrepl_commandsが増え続ける原因とレプリケーション遅延の確認方法
配布データベースのコマンド滞留を、配布エージェントの稼働状況とクリーンアップジョブ・保持期間の両面から切り分ける手順です。
関連サービス
ログ肥大化の緊急対応を依頼する
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
ログ肥大化の緊急対応を依頼する