5.

Oracle CKPT (Checkpoint Process) の役割とパラメータ (リカバリ時間短縮)

編集
この記事の要点
  • CKPT = Checkpoint Process。Oracle のバックグラウンドプロセスの 1 つ
  • 主な仕事は 「データファイルのヘッダと制御ファイルにチェックポイント SCN を書き込む」
  • 実際のダーティバッファ書き出しは DBWn が担当。CKPT は合図役 + メタ更新役
  • LOG_CHECKPOINT_INTERVAL / LOG_CHECKPOINT_TIMEOUT / FAST_START_MTTR_TARGET で制御
  • Incremental Checkpoint により、インスタンスリカバリ時間を短縮できる
  • 手動なら ALTER SYSTEM CHECKPOINT。SHUTDOWN NORMAL/IMMEDIATE 時もフルチェックポイントが走る

Checkpoint とは何か

Oracle のデータは普段 Buffer Cache (メモリ) で書き換えられ、変更内容は Redo Log に逐次記録されます。実データファイルへの反映 (DBWR) は遅延書きです。

このとき、「ある時点までの変更はデータファイルにも書ききった」というマークが必要です。これが チェックポイント (Checkpoint)。インスタンス障害時のリカバリ起点になります。

[Buffer Cache] --(dirty)--> [DBWR] --> [Data Files]
       |
       v
   [LGWR] --> [Redo Log Files]
       |
       v
   [CKPT] --> Control File / Data File Header に
              「ここまで書き出した」SCN を記録

CKPT プロセスの役割

  • DBWn にダーティバッファの書き出しを指示する (実書きは DBWn が担当)
  • Redo Log の現在の SCN (System Change Number) を制御ファイルとデータファイルヘッダに記録
  • SHUTDOWN / ログスイッチ / 表領域オフライン化等のイベントで起動
  • Incremental Checkpoint (継続的なチェックポイント) を制御

関連パラメータ

パラメータ意味
LOG_CHECKPOINT_INTERVALRedo Block 数。指定数の Redo を書いたらチェックポイント
LOG_CHECKPOINT_TIMEOUT秒数。指定秒経ったらチェックポイント
FAST_START_MTTR_TARGETリカバリ目標時間 (秒)。Oracle が自動で他のパラメータを調整
LOG_CHECKPOINTS_TO_ALERTTRUE にすると Alert Log に CKPT イベントを出力

現代の運用では FAST_START_MTTR_TARGET だけ設定するのが定石です (例: 60 秒)。

-- 現在の設定確認
SHOW PARAMETER fast_start_mttr_target;
SHOW PARAMETER log_checkpoint;

-- 推奨: MTTR ベース
ALTER SYSTEM SET fast_start_mttr_target = 60 SCOPE=BOTH;

-- 手動チェックポイント
ALTER SYSTEM CHECKPOINT;

-- ローカルチェックポイント (RAC で 1 インスタンスのみ)
ALTER SYSTEM CHECKPOINT LOCAL;

-- グローバル (全インスタンス)
ALTER SYSTEM CHECKPOINT GLOBAL;

チェックポイント情報の確認

-- 現在の SCN とチェックポイント SCN
SELECT name, current_scn, checkpoint_change#
FROM v$database;

-- インスタンスのチェックポイント状況
SELECT instance_name, status, checkpoint_change#
FROM v$instance;

-- データファイル単位のチェックポイント SCN
SELECT file#, status, checkpoint_change#, last_change#
FROM v$datafile;

-- リカバリ予測時間
SELECT recovery_estimated_ios,
       actual_redo_blks,
       target_redo_blks,
       estimated_mttr   -- 秒
FROM v$instance_recovery;

Incremental Checkpoint

古い Oracle はチェックポイント時に大量の I/O が走り、性能が一気に落ちる「Checkpoint storm」が発生していました。現代の Oracle は 常に少しずつダーティバッファを書き続ける Incremental Checkpoint 方式で平準化しています。

FAST_START_MTTR_TARGET を短く設定するほど書き出しが活発になり、リカバリ時間は短いが日常 I/O は増えるトレードオフです。

Checkpoint が走るタイミング

  • Log Switch 時 (REDO Log がフル → 次のグループへ切替)
  • SHUTDOWN NORMAL / IMMEDIATE / TRANSACTIONAL 時 (フルチェックポイント)
  • ALTER SYSTEM CHECKPOINT 実行時
  • 表領域を OFFLINE NORMAL / BEGIN BACKUP にしたとき
  • パラメータで定めた時間 / 量に達したとき
  • Incremental に常時 (FAST_START_MTTR_TARGET ベース)

SHUTDOWN との関係

SHUTDOWN 種別チェックポイント備考
NORMAL★ フル実行全セッション終了待ち
IMMEDIATE★ フル実行セッション強制ロールバック
TRANSACTIONAL★ フル実行トランザクション完了待ち
ABORT実行しないインスタンスリカバリが次回起動時に必要

Fast Recovery とのつながり

クラッシュ後の SMON によるインスタンスリカバリは、最新チェックポイントの SCN から Redo を再適用します。チェックポイントが新しいほど再適用範囲は狭く、起動が速いというロジックです。

[Crash] -> 起動
  SMON: 制御ファイルから「最新の checkpoint SCN」を取得
        その SCN 以降の Redo を順に適用 (Roll Forward)
        コミット未完了トランザクションを Undo (Roll Back)
  → DB Open

FAST_START_MTTR_TARGET を 60 にしておけば
おおむね 60 秒以内に Open するように Oracle が調整する

FAQ

Q: チェックポイントが頻繁すぎると?
A: I/O 負荷が上がります。FAST_START_MTTR_TARGET を大きくする (例: 300 秒) と平準化されますが、リカバリ時間が伸びます。

Q: LOG_CHECKPOINT_INTERVAL は今でも使う?
A: 現代では基本不要 (0 = 無効)。FAST_START_MTTR_TARGET に統一するのが Oracle の推奨です。

Q: Alert Log に何が出る?
A: LOG_CHECKPOINTS_TO_ALERT = TRUE にすると、Beginning/End checkpoint 行が出ます。レイテンシ調査時に便利です。

編集
Post Share
子ページ

子ページはありません

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

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