2.

Oracle Database の構成(インスタンスとデータベース、CDB/PDB、データファイル / REDO / Tablespace)

編集
この記事の要点
  • Oracle は「インスタンス」(プロセス + メモリ)と「データベース」(ファイル群)を完全分離
  • インスタンス = SGA メモリ + バックグラウンドプロセス(DBWR / LGWR / SMON 等)
  • データベース = データファイル + REDO ログファイル + 制御ファイル
  • Oracle 12c からマルチテナント(CDB / PDB)。1 つの CDB に複数 PDB をホスト
  • 論理構造はTablespace → Segment → Extent → Block。物理は OS のデータファイル

Oracle 全体構成図(俯瞰)

┌─────────────────────────── サーバ(OS)───────────────────────────┐
│                                                                     │
│   ┌── インスタンス (Instance) ──┐    ┌── データベース (Database)──┐│
│   │                             │    │                             ││
│   │  SGA (System Global Area)   │    │  データファイル(*.dbf)      ││
│   │   - Database Buffer Cache   │    │   - SYSTEM / SYSAUX         ││
│   │   - Redo Log Buffer         │◄──►│   - UNDO / TEMP / USERS     ││
│   │   - Shared Pool             │    │  REDO ログ(*.log) × 多重化  ││
│   │   - Large Pool / Java Pool  │    │  制御ファイル(control*.ctl)  ││
│   │                             │    │  アーカイブログ(arch_*)      ││
│   │  バックグラウンドプロセス    │    │  パスワードファイル / SPFILE ││
│   │   DBWR / LGWR / SMON /      │    │                             ││
│   │   PMON / CKPT / ARCn / RVWR │    └─────────────────────────────┘│
│   └─────────────────────────────┘                                   │
└─────────────────────────────────────────────────────────────────────┘
        ↑
   クライアント接続 (リスナー経由)

インスタンスとデータベースの分離(Oracle 独特)

他の DB(MySQL / PostgreSQL)では「DB プロセス = DB」ですが、Oracle は明確に分離されています:

用語実体説明
インスタンスメモリ + プロセス停止できる。STARTUP/SHUTDOWN で生成/破棄
データベースファイル群OS 上に永続。インスタンス停止しても消えない
マウント結合状態インスタンスがデータベースを認識
オープン使用可能状態ユーザがクエリ可能
RAC(Real Application Clusters)複数インスタンス + 1 データベース★複数ノードで 1 つの DB を共有

主要バックグラウンドプロセス

プロセス役割
DBWR (DBWn)Buffer Cache の変更ブロックをデータファイルに書き出し
LGWRREDO Log Buffer の変更ログを REDO ログファイルに書き出し
CKPTチェックポイントを制御ファイル/データファイルヘッダに記録
SMONSystem Monitor — インスタンス起動時のクラッシュリカバリ
PMONProcess Monitor — 異常終了したユーザプロセスのクリーンアップ
ARCnREDO ログを Archived Log としてコピー(ARCHIVELOG モード時)
RECO分散トランザクションのリカバリ

SGA(System Global Area)の中身

-- SGA の構成を確認
SELECT * FROM v$sga;
-- Fixed Size, Variable Size, Database Buffers, Redo Buffers

-- 詳細
SELECT * FROM v$sgastat;

-- SGA 内のコンポーネント
SELECT component, current_size FROM v$sga_dynamic_components;
-- shared pool
-- large pool
-- java pool
-- streams pool
-- DEFAULT buffer cache
-- KEEP / RECYCLE buffer cache

データベースを構成するファイル群

ファイル役割多重化
データファイル (*.dbf)テーブル/インデックスの実体RAID/ASM
制御ファイル (control*.ctl)DB 物理構造のメタ情報★必須多重化(3つ推奨)
REDO ログ (redo*.log)変更履歴(リカバリ用)★必須多重化 + グループ化
アーカイブログ (arch_*)REDO のバックアップRMAN で管理
パスワードファイルSYSDBA 接続認証
パラメータファイル (SPFILE/PFILE)インスタンス設定

論理構造: Tablespace → Segment → Extent → Block

Tablespace (例: USERS)
   ├─ Segment (テーブル / インデックス 1 個)
   │     ├─ Extent (連続したブロックの塊)
   │     │     ├─ Block (Oracle の最小 I/O 単位、デフォルト 8KB)
   │     │     ├─ Block
   │     │     └─ Block
   │     └─ Extent
   └─ Segment

物理:
Tablespace は 1 つ以上の Data File で構成
1 つの Data File は 1 つの Tablespace に所属
-- Tablespace 一覧
SELECT tablespace_name, status, contents
FROM dba_tablespaces;

-- 各 Tablespace のサイズと使用率
SELECT tablespace_name,
       ROUND(bytes/1024/1024, 1) AS total_mb,
       ROUND(maxbytes/1024/1024, 1) AS max_mb
FROM dba_data_files;

-- Tablespace 作成
CREATE TABLESPACE users_ts
DATAFILE '/u01/app/oracle/oradata/users01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 10G;

-- Segment 確認
SELECT segment_name, segment_type, tablespace_name, bytes
FROM user_segments;

マルチテナント (CDB / PDB) — Oracle 12c 以降

従来 1 サーバ = 1 DB だったのを、コンテナ DB (CDB) の中に複数のプラガブル DB (PDB) をホストできるように変更:

┌── CDB(Container Database)──────────────────────┐
│                                                  │
│   ┌── ROOT (CDB$ROOT) ──────────────────────┐   │
│   │  共通ユーザ・OS / SYS スキーマ           │   │
│   └─────────────────────────────────────────┘   │
│                                                  │
│   ┌── PDB$SEED ──────────────────────────────┐  │
│   │  新規 PDB 作成用のテンプレート            │  │
│   └─────────────────────────────────────────┘   │
│                                                  │
│   ┌── PDB1 ─────┐  ┌── PDB2 ─────┐  ┌── PDB3 ┐ │
│   │  業務 A      │  │  業務 B      │  │  業務 C │ │
│   │  独自スキーマ│  │  独自スキーマ│  │  ...    │ │
│   └─────────────┘  └─────────────┘  └────────┘  │
└──────────────────────────────────────────────────┘
-- 現在の接続コンテナ確認
SHOW CON_NAME;

-- PDB 一覧
SELECT name, open_mode FROM v$pdbs;

-- PDB 切替
ALTER SESSION SET CONTAINER = PDB1;

-- PDB 起動
ALTER PLUGGABLE DATABASE PDB1 OPEN;

-- 19c 以降は無償でも 3 PDB まで作成可能(21c で 32 PDB に拡張)
-- それ以上は Enterprise Edition + Multitenant オプション必要

起動の 4 段階

段階状態説明
SHUTDOWN停止インスタンスもファイルもアクセスなし
NOMOUNTインスタンス起動SGA/プロセス作成。CREATE DATABASE 用
MOUNT制御ファイル読込リカバリ・名前変更可能
OPEN使用可能通常のクエリ可能
-- 起動
STARTUP NOMOUNT;
ALTER DATABASE MOUNT;
ALTER DATABASE OPEN;

-- まとめて
STARTUP;       -- 通常起動(OPEN まで)

-- 読み取り専用
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;

-- 停止
SHUTDOWN IMMEDIATE;  -- 推奨。トランザクション中断 + ロールバック
SHUTDOWN ABORT;      -- 緊急。次回起動でクラッシュリカバリ

FAQ

Q: インスタンスとデータベース、どちらが「DB」?
A: 厳密にはデータベース=ファイル群、インスタンス=プロセス+メモリ。両方揃わないと使えない。日常会話では「DB」で両方を指す。

Q: PostgreSQL や MySQL の「データベース」と Oracle の「スキーマ」、どちらが対応?
A: Oracle の「スキーマ」≒ MySQL/PostgreSQL の「データベース」。Oracle の「データベース」は MySQL の「インスタンス」に近い概念。

Q: 19c 以降、Non-CDB(昔の単一 DB)は使えない?
A: 21c で Non-CDB は完全廃止。必ず CDB / PDB 構成。

編集
Post Share
子ページ
  1. 物理構造
  2. 論理構造
同階層のページ
  1. インスタンス
  2. Oracle データベース(インスタンスとデータベースの分離・CDB / PDB・物理構造)
  3. プロセス

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