2.

Oracle LGWR(ログライター)バックグラウンドプロセス - 書き込みタイミング / REDO ログとの関係 / 監視 SQL

編集
この記事の要点
  • LGWR(Log Writer)は Oracle Database の必須バックグラウンドプロセス。REDO ログバッファの内容をREDO ログファイルへ書き出す役割
  • COMMIT 時 / バッファ 1/3 / 1 MB / 3 秒ごと / DBWR がデータ書き込み前など、複数のトリガで書き込む
  • Write Ahead Logging(先行書き込み)原則により、データファイル更新のに必ず REDO を書く
  • 12c 以降は 並列 LGWR(LG00 〜 LGnn)でスケーラビリティを改善
  • 監視は V$SESSION_WAITlog file sync 待機と V$SYSSTAT の REDO 統計で行う

LGWR とは

LGWRLog Writer、ログライター)は Oracle Database を起動すると必ず動くバックグラウンドプロセスの 1 つで、SGA(共有メモリ)内の REDO ログバッファの内容をオンライン REDO ログファイルに書き出します。

Oracle は障害時にコミット済みトランザクションを必ず復元するため、データブロックの変更内容は REDO(再実行情報)として記録します。この REDO を実際にディスクに書き出すのが LGWR の責務で、データベースの耐障害性を担保する最重要プロセスです。

動作フロー

  1. ユーザープロセスが UPDATE 等を実行 → REDO レコードREDO ログバッファに書く
  2. LGWR が起動条件を満たすと REDO ログバッファ → オンライン REDO ログファイルへ書き出し
  3. 書き込み完了後、ユーザープロセスに完了通知
  4. 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マスタ。ワーカーへの割り振り
LG00LGnn並列書き込みワーカー
LREGリスナー登録

COMMIT との関係

SQL の COMMIT はユーザー視点で「結果が永続化された」ことを意味しますが、その裏では LGWR がREDO をディスクに書き終えるのを待つ動作になります。この待機が V$SESSION_WAITlog 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_WRITEIMMEDIATE / BATCH × WAIT / NOWAIT の組合せでコミット書き込み挙動を制御
LOG_BUFFERREDO ログバッファのサイズ。12c 以降は自動調整
DB_WRITER_PROCESSESDBWR の並列度(LGWR とは別だが連動)
FAST_START_MTTR_TARGETインスタンスリカバリの目標時間。チェックポイント頻度に影響

チューニングの観点

  • log file sync が長い → REDO ログファイルを高速ディスク(SSD)に配置
  • OLTP で COMMIT 数が多い → COMMIT_WRITE = BATCH, NOWAIT も検討(耐障害性とトレードオフ)
  • REDO ログサイズが小さい → ログスイッチ多発でアーカイブ負荷増。100 MB 〜 数 GB に拡大
  • RAC では LGWR の並列化と専用ディスクの I/O 性能が特に重要

他のバックグラウンドプロセスとの違い

プロセス役割
LGWRREDO ログバッファ → REDO ログファイル
DBWRデータベースバッファ → データファイル
CKPTチェックポイント情報の更新
SMONシステムモニタ。インスタンスリカバリ
PMONプロセスモニタ。クライアントの切断処理
ARCnREDO ログをアーカイブログにコピー

障害時の挙動

LGWR が異常終了すると Oracle インスタンスは即座にクラッシュします(必須プロセスのため)。再起動時に SMON によるインスタンスリカバリが走り、REDO ログから未反映の変更を再適用してデータベースを整合状態に戻します。

まとめ

  1. LGWR は REDO ログバッファ → REDO ログファイルを担当する必須プロセス
  2. COMMIT / 3 秒 / 1 MB / 1/3 / DBWR 前 などの複数トリガで動く
  3. Write Ahead Logging により耐障害性を保証
  4. 12c 以降は 並列 LGWR でスケーラブル
  5. 監視は log file sync 待機と v$sysstat

関連

  • DBWR — データベースライター
  • CKPT — チェックポイントプロセス
  • SMON — システムモニタ
  • REDO ログ — 再実行情報を記録するログ
  • インスタンスリカバリ — クラッシュ後の自動復旧
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. DBW
  2. LGWR
  3. SMON
  4. PMON (Process Monitor)
  5. CKPT
  6. ARC (Archiver Process / アーカイバ プロセス)

最近更新/作成されたページ