| この記事の要点 |
|
LGWR とは
LGWR(Log Writer、ログライター)は Oracle Database を起動すると必ず動くバックグラウンドプロセスの 1 つで、SGA(共有メモリ)内の REDO ログバッファの内容をオンライン REDO ログファイルに書き出します。
Oracle は障害時にコミット済みトランザクションを必ず復元するため、データブロックの変更内容は REDO(再実行情報)として記録します。この REDO を実際にディスクに書き出すのが LGWR の責務で、データベースの耐障害性を担保する最重要プロセスです。
動作フロー
- ユーザープロセスが UPDATE 等を実行 → REDO レコードを REDO ログバッファに書く
- LGWR が起動条件を満たすと REDO ログバッファ → オンライン REDO ログファイルへ書き出し
- 書き込み完了後、ユーザープロセスに完了通知
- COMMIT の場合はこの完了通知を待ってからユーザーに「コミット成功」を返す
書き込みトリガ
| トリガ | 説明 |
|---|---|
| COMMIT | トランザクションがコミットされた時点(最重要) |
| 3 秒間隔 | 定期的なフラッシュ |
| REDO ログバッファが 1/3 以上 | バッファ使用量しきい値 |
| REDO レコードが 1 MB 蓄積 | サイズしきい値 |
| DBWR がデータ書き込みを行う前 | Write Ahead Logging 原則の保証 |
| ログスイッチ | オンライン REDO ログの切替時 |
Write Ahead Logging(先行書き込み)
Oracle の根幹原則として「データブロックを書く前に必ず REDO を書く」(Write Ahead Logging)があります。DBWR がダーティバッファをデータファイルに書き出す前に、対応する REDO を LGWR が書き終えていることが保証されます。これによりインスタンス障害時もコミット済みデータは必ず復元できます。
並列 LGWR(12c 以降)
Oracle 12c から 並列 LGWR がサポートされ、メイン LGWR とワーカープロセス LG00, LG01, ... LGnn が並列に書き込みを行います。OLTP 高負荷環境での REDO 書き込みボトルネックを大幅に緩和します。
| プロセス | 役割 |
|---|---|
LGWR | マスタ。ワーカーへの割り振り |
LG00 〜 LGnn | 並列書き込みワーカー |
LREG | リスナー登録 |
COMMIT との関係
SQL の COMMIT はユーザー視点で「結果が永続化された」ことを意味しますが、その裏では LGWR がREDO をディスクに書き終えるのを待つ動作になります。この待機が V$SESSION_WAIT で log file sync イベントとして観測されます。
監視 SQL
-- LGWR プロセスの存在確認
SELECT pname, pid, spid, program
FROM v$process
WHERE pname IN ('LGWR') OR pname LIKE 'LG%';
-- log file sync 待機(COMMIT 待ち)
SELECT event, total_waits, time_waited
FROM v$system_event
WHERE event IN ('log file sync', 'log file parallel write');
-- REDO の書き込み統計
SELECT name, value
FROM v$sysstat
WHERE name IN ('redo writes', 'redo blocks written', 'redo size');
-- オンライン REDO ログの状況
SELECT group#, status, bytes/1024/1024 AS mb, members
FROM v$log;
同期 / 非同期コミット
Oracle のデフォルト挙動は同期コミットで、COMMIT 文を発行したユーザは LGWR が REDO をディスクへ書き終えるまで待たされます。これがトランザクション数の多い OLTP では log file sync 待機として現れます。COMMIT_WRITE = BATCH, NOWAIT を指定すると非同期コミットになり、ユーザは LGWR の完了を待たずに次の処理へ進めます。ただしインスタンス障害時に直近のコミットが失われる可能性があるため、金融系のような絶対に失えない処理では使用しません。一般的な業務系で大量のバッチ更新を流すときに、レスポンスタイム短縮目的で部分的に採用します。
関連パラメータ
| パラメータ | 説明 |
|---|---|
COMMIT_WRITE | IMMEDIATE / BATCH × WAIT / NOWAIT の組合せでコミット書き込み挙動を制御 |
LOG_BUFFER | REDO ログバッファのサイズ。12c 以降は自動調整 |
DB_WRITER_PROCESSES | DBWR の並列度(LGWR とは別だが連動) |
FAST_START_MTTR_TARGET | インスタンスリカバリの目標時間。チェックポイント頻度に影響 |
チューニングの観点
- log file sync が長い → REDO ログファイルを高速ディスク(SSD)に配置
- OLTP で COMMIT 数が多い →
COMMIT_WRITE = BATCH, NOWAITも検討(耐障害性とトレードオフ) - REDO ログサイズが小さい → ログスイッチ多発でアーカイブ負荷増。100 MB 〜 数 GB に拡大
- RAC では LGWR の並列化と専用ディスクの I/O 性能が特に重要
他のバックグラウンドプロセスとの違い
| プロセス | 役割 |
|---|---|
| LGWR | REDO ログバッファ → REDO ログファイル |
| DBWR | データベースバッファ → データファイル |
| CKPT | チェックポイント情報の更新 |
| SMON | システムモニタ。インスタンスリカバリ |
| PMON | プロセスモニタ。クライアントの切断処理 |
| ARCn | REDO ログをアーカイブログにコピー |
障害時の挙動
LGWR が異常終了すると Oracle インスタンスは即座にクラッシュします(必須プロセスのため)。再起動時に SMON によるインスタンスリカバリが走り、REDO ログから未反映の変更を再適用してデータベースを整合状態に戻します。
まとめ
- LGWR は REDO ログバッファ → REDO ログファイルを担当する必須プロセス
- COMMIT / 3 秒 / 1 MB / 1/3 / DBWR 前 などの複数トリガで動く
- Write Ahead Logging により耐障害性を保証
- 12c 以降は 並列 LGWR でスケーラブル
- 監視は
log file sync待機とv$sysstatで
関連
- DBWR — データベースライター
- CKPT — チェックポイントプロセス
- SMON — システムモニタ
- REDO ログ — 再実行情報を記録するログ
- インスタンスリカバリ — クラッシュ後の自動復旧
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09