2.

Oracle Database アーキテクチャ完全ガイド

編集
この記事の要点
  • Oracle はインスタンス (メモリ+プロセス) と データベース (ファイル群) が分離した独自アーキテクチャ
  • インスタンス = SGA (System Global Area) + バックグラウンドプロセス
  • データベース = Data Files + Control Files + Online Redo Log Files
  • Oracle 12c+ のCDB / PDB (Multitenant) で 1 インスタンス上に複数 DB を集約
  • Tablespace (SYSTEM/SYSAUX/USERS/TEMP/UNDO) でストレージを論理管理

Oracle Database 全体アーキテクチャ

Oracle Database は他の RDBMS と異なり、「インスタンス」と「データベース」を明確に分離します。MySQL では「データベース」が論理スキーマを指しますが、Oracle では「データベース」=ディスク上のファイル群です。

概念正体消えると
インスタンスメモリ (SGA) + プロセス群再起動で消える (一時的)
データベースディスク上のファイル群永続データ (消したら復旧必要)

1 つのインスタンスは 1 つのデータベースに接続して動きます (Oracle RAC では複数インスタンスが 1 DB を共有)。

インスタンスの内部構造

SGA (System Global Area)

コンポーネント役割
Database Buffer Cacheデータブロックのキャッシュ (最大コンポーネント)
Shared PoolSQL 解析結果 / 実行計画キャッシュ / データディクショナリキャッシュ
Redo Log BufferREDO ログを Online Redo Log Files に書き込む前のバッファ
Large Poolバックアップ / RMAN / 並列クエリ用
Java PoolJava VM 用メモリ
Streams PoolStreams / GoldenGate 用

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

プロセス役割
DBWn (Database Writer)Buffer Cache の変更を Data File へ書き込み
LGWR (Log Writer)Redo Log Buffer を Online Redo Log Files へ書き込み
CKPT (Checkpoint)チェックポイント発生時に Data File と Control File を更新
SMON (System Monitor)インスタンス起動時の Crash Recovery、一時 Tablespace 領域回収
PMON (Process Monitor)異常終了したユーザープロセスのクリーンアップ
ARCn (Archiver)満杯になった Online Redo Log を Archive Log に退避
MMON / MMNLAWR スナップショット、自動メンテナンス

データベースの物理構成

ファイル種別役割失うと
Data Files (.dbf)実データ・インデックスを格納該当データ消失
Control Files (.ctl)DB 構造・ファイルパス・SCN 管理DB 起動不可 (バックアップ必須)
Online Redo Log Files (.log)変更履歴 (現在進行中)復旧不可
Archive Log Files満杯になった Redo の退避PITR 不可
Parameter File (init.ora / spfile.ora)初期化パラメータデフォルト値で起動
Password File (orapwSID)SYSDBA 等の特権ユーザー認証OS 認証で再作成
Alert Log / Trace Filesエラーログ・トレース履歴消失のみ

Tablespace (表領域)

Oracle は論理的なストレージ管理単位として Tablespace を用います。物理 Data File をグループ化したものが Tablespace で、テーブルは Tablespace に作成されます。

Tablespace用途
SYSTEMデータディクショナリ (システムのメタデータ)
SYSAUXSYSTEM の補助 (AWR・Statspack 等)
UNDO (UNDOTBS1)ロールバックセグメント (Read Consistency)
TEMPソート・ハッシュ結合・一時表用
USERSユーザーテーブルのデフォルト
業務用 (例: APP_DATA)個別アプリ向けに作成
-- 表領域作成
CREATE TABLESPACE app_data
DATAFILE '/u01/oradata/orcl/app_data01.dbf' SIZE 1G
AUTOEXTEND ON NEXT 100M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL;

-- 表領域にテーブル作成
CREATE TABLE users (
    id NUMBER,
    name VARCHAR2(100)
) TABLESPACE app_data;

-- 表領域一覧
SELECT tablespace_name, status, contents FROM dba_tablespaces;

-- 使用量
SELECT tablespace_name,
       ROUND(SUM(bytes)/1024/1024) AS mb_used
FROM dba_segments
GROUP BY tablespace_name;

CDB / PDB (Multitenant: Oracle 12c+)

Oracle 12c から導入されたマルチテナント構成。1 つの Container DB (CDB) の中に複数の Pluggable DB (PDB) を配置し、リソースを集約します。19c 以降は CDB 必須 (Non-CDB 廃止)。

概念内容
CDB$ROOT全 PDB 共通のメタデータ・SYS ユーザー
PDB$SEED新規 PDB 作成用テンプレート
PDB1, PDB2, ...業務アプリ用 PDB (テナント)
-- 現在の接続先確認
SHOW CON_NAME;
SELECT name, con_id, open_mode FROM v$pdbs;

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

-- PDB 作成
CREATE PLUGGABLE DATABASE pdb_app1
  ADMIN USER pdb_admin IDENTIFIED BY pass
  FILE_NAME_CONVERT = ('/seed/', '/pdb_app1/');

ALTER PLUGGABLE DATABASE pdb_app1 OPEN;

-- 接続: tnsnames.ora で SERVICE_NAME = pdb_app1

Net Services / Listener

クライアントはOracle Listener (TCP/1521 デフォルト) 経由でインスタンスに接続します。

# tnsnames.ora (クライアント側)
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

# listener.ora (サーバ側)
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
    )
  )

# 操作
lsnrctl start
lsnrctl status
lsnrctl services

動的パフォーマンスビュー (v$)

-- インスタンス情報
SELECT instance_name, host_name, version, startup_time, status
FROM v$instance;

-- データベース情報
SELECT name, dbid, created, log_mode, open_mode FROM v$database;

-- データファイル
SELECT file#, name, bytes/1024/1024 AS mb, status FROM v$datafile;

-- セッション
SELECT sid, serial#, username, program, status FROM v$session
WHERE username IS NOT NULL;

-- 待機イベント (どこで詰まっているか)
SELECT event, total_waits, time_waited
FROM v$system_event
ORDER BY time_waited DESC FETCH FIRST 10 ROWS ONLY;

-- SGA サイズ
SELECT * FROM v$sgainfo;

初期化パラメータ (init.ora / spfile)

-- 現在の値
SHOW PARAMETER sga_target;
SELECT name, value FROM v$parameter WHERE name = 'db_cache_size';

-- 動的変更 (spfile + memory)
ALTER SYSTEM SET sga_target = 2G SCOPE=BOTH;

-- spfile のみ変更 (再起動後反映)
ALTER SYSTEM SET processes = 500 SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

-- 主要パラメータ
-- sga_target           : SGA 自動管理サイズ
-- pga_aggregate_target : PGA 自動管理サイズ
-- processes            : 最大プロセス数
-- sessions             : 最大セッション数
-- open_cursors         : 1 セッションあたり最大カーソル数
-- db_block_size        : ブロックサイズ (8K がデフォルト、DB 作成後変更不可)

FAQ

Q: ORACLE_SID と DB_NAME と SERVICE_NAME の違いは?
A: ORACLE_SID = OS から見たインスタンス識別子、DB_NAME = データベース固有名、SERVICE_NAME = Listener 経由で接続するサービス名 (1 DB に複数可)。

Q: NOARCHIVELOG モードと ARCHIVELOG モードの違いは?
A: ARCHIVELOG なら満杯になった Online Redo Log が Archive Log に保存され、PITR (Point-in-Time Recovery) 可能。本番は必須。NOARCHIVELOG はバックアップ時点までしか戻せません。

Q: PDB と Schema の違いは?
A: Schema = 1 ユーザーの所有オブジェクト群 (DB 内の名前空間)、PDB = 独立したデータベース (独自の SYS、独自のスキーマ群を持つ)。マルチテナント分離が PDB の存在意義。

編集
Post Share
子ページ
  1. インスタンス
  2. Oracle データベース(インスタンスとデータベースの分離・CDB / PDB・物理構造)
  3. プロセス
同階層のページ
  1. 環境構築
  2. データベースの構成
  3. SQL
  4. DBオブジェクト
  5. 表領域
  6. 管理ツール
  7. パフォーマンス関連

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