RDBMSとは
RDBMS = Relational Database Management System。データを「行」と「列」を持つ表(テーブル)として管理する仕組みです。
- テーブル同士をキーで関連付け(リレーション)、整合性を保ちながら検索・更新できる。
- ユーザは
SQL(宣言型言語)で要求を伝え、DBエンジンが最適な実行方法(実行計画)を選ぶ。 - 複数ユーザの同時アクセスを安全に処理するため、トランザクション と ロック を備える。
- 障害から復旧するために REDO/UNDO といったログ機構を持つ。
RDBMSが担うこと
- SQL 解析・最適化
- 実行・データ取得
- 同時実行制御(Lock)
- 永続化と障害回復(REDO/UNDO)
- セキュリティ・監査
クライアント・サーバ構成
アプリ(クライアント)はネットワーク経由でDBサーバに接続し、SQLを送って結果を受け取ります。
- 接続はTCP上のDB専用プロトコル(Oracle Net / PG wire / TDS / DRDA など)
- 1接続 ≒ 1セッション(1サーバプロセス/スレッド)
- 接続コストは大きい ⇒ 必ずコネクションプール
アプリ ↔ DBの間に「リスナー」がいて、接続要求をサーバプロセスへ取り次ぐイメージ。
// 概念図
App (Client) ──SQL──> Listener ──> Server Process
│
┌────────┴────────┐
│ DB Server (Instance) │
│ SGA (共有メモリ) │
│ ├ Buffer Cache │
│ └ REDO Buffer │
│ Background Processes │
└────────┬────────────────┘
↓
Storage (データファイル/ログ/制御)
インスタンスとデータベース
インスタンス (Instance) = メモリ + プロセス群
- サーバ起動時に確保される共有メモリ領域と、それを利用するDBエンジンのプロセス集合。
- SQLの解析、キャッシュ管理、ログ書き出し、チェックポイントなどはここで動く。
- 再起動すると揮発する状態(メモリ・キャッシュ)。
- 1台のサーバに複数インスタンスを動かすことも可能。
データベース (Database) = ディスク上のファイル群
- データファイル / 制御ファイル / REDOログ等のディスク上の永続データの集合体。
- インスタンスを停止しても消えない(永続)。
- 1つのDBに対し、複数インスタンスから接続する構成(RAC/共有DBクラスタ)も存在する。
- バックアップとリストアの単位もこのレイヤ。
POINT 「データベースを止めた」と言うとき、実は「インスタンスを止めた」だけのことが多い。
メモリ構造(共有メモリとセッションメモリ)
共有メモリ(SGA 相当)
- Buffer Cache: テーブル/インデックスのブロックをキャッシュ。読み書きは原則このキャッシュ経由で行われる。
- REDO Log Buffer: 更新変更履歴を一時的に保持。コミット時等にディスクのREDOログへ書き出される。
- Shared Pool: SQLの解析結果(実行計画)、辞書情報、PL/SQLなどをキャッシュ。同一SQLの再利用効率に直結。
- その他: Large Pool / Java Pool / 結果キャッシュなど、製品により様々。
セッション専用メモリ(PGA 相当)
- 接続中のセッションごとに確保
- ソート/ハッシュ結合の作業域
- カーソル状態・バインド変数
- 大きくなりすぎると一時表領域へ溢れる(Disk Sort / Spill to disk)⇒ パフォーマンスを大きく左右
バックグラウンドプロセス
インスタンスは表に出ない多くの常駐プロセスを内包します。代表的なものを以下に示します。
- DBWR / Writer: バッファキャッシュ上の汚れたブロックをデータファイルに書き出す。
- LGWR / Log Writer: REDOログバッファをオンラインREDOログに書き出す。コミットの中核。
- CKPT / Checkpoint: 整合点を作成し、データファイルに「ここまで反映済」と記録。
- ARCH / Archiver: 満杯になったオンラインREDOをアーカイブログへコピー(アーカイブモード時)。
- SMON / System Mon: 再起動時のリカバリ、一時セグメントの解放など。
- PMON / Process Mon: 異常終了したセッションのクリーンアップ、ロックの解放など。
プロセス名は製品により異なるが「役割」はほぼ共通です。