物理階層の全体像

RDBMSはディスクを以下のような階層で管理しています。

  • Block(ブロック): I/Oの最小単位。4K/8K/16Kなど。1ブロックに複数行が入る。
  • Extent(エクステント): 連続するブロックのまとまり。セグメントが大きくなる度に確保。
  • Segment(セグメント): テーブル / インデックス / LOBごとの論理的なまとまり。
  • Tablespace(表領域): 1つ以上のデータファイルから成る論理的な格納先。

ブロック → エクステント → セグメント → 表領域

用途別に表領域を分けるのが一般的です。

  • USERS: 業務データを格納
  • INDEX: インデックス専用
  • TEMP: 一時表領域(ソートなど)
  • UNDO: ロールバック領域
  • SYSTEM: 辞書情報
  • LOB: 大きなオブジェクト用

データファイル / REDOログ / 制御ファイル

データファイル

実データ・インデックスの実体。

  • 表領域 = 1つ以上のデータファイルの集合
  • 更新は基本「バッファキャッシュ → DBWR → ファイル」

REDOログ

変更履歴を時系列で記録。

  • コミット時にLGWRが必ず書き出す
  • 障害時はREDOを再適用してリカバリ

制御ファイル

DB全体の構成情報・状態。

  • データファイル/REDOログのパスやSCN
  • 破損するとマウント不可 ⇒ 必ず多重化

アーカイブログ

満杯になったREDOの退避コピー。

  • アーカイブモード時のみ
  • PITR(指定時点復旧)に必須

UNDO(ロールバック領域)

更新前のイメージを保管。

  • ROLLBACK / 一貫性読み取りで利用
  • トランザクションが長いとUNDOを圧迫しやすい

一時(TEMP)

ソート/作業領域の溢れ先。

  • PGAで処理しきれない場合の退避
  • 後の章で詳述

バッファキャッシュとI/Oの流れ

  • SELECT は必要なブロックをファイルから読み、バッファキャッシュに乗せる(キャッシュヒットしなければ物理I/O)。
  • UPDATE はバッファキャッシュ上のブロックを書き換える + REDOログバッファに変更履歴を残す。
  • 実ファイルへの書き出しは DBWR が後でまとめて行う(= ユーザは待たない)。
  • コミット時には REDO が必ずディスクに書かれる ⇒ そこで初めて「永続化された」と言える。
バッファキャッシュ上の状態:
  • Dirty: 変更あり、未書き出し
  • Clean: ディスクと同一