Oracle Database アーキテクチャの構成要素(インスタンス構造)

 


🧠 Oracleインスタンスの概要

  • Oracleインスタンスは、メモリ領域(SGA)バックグラウンドプロセス の2つで構成される。

  • インスタンスはサーバー起動時に生成され、データベースへのすべてのアクセスと処理はこのインスタンス内で行われる。

  • インスタンス内のデータは、最終的にデータベースファイルに書き込まれる。


💾 メモリ構造:SGA(System Global Area)

🔹 SGAの主な構成要素

コンポーネント役割
Library CacheSQL文の解析木・実行計画を保存。複数ユーザが同一SQLを実行する際に再利用され、メモリを節約し高速化。
Data Dictionary Cacheテーブル定義、ユーザ権限などの情報をキャッシュ。常に参照されるため、性能に直結。
Server Result CacheSQLやPL/SQL関数の実行結果をキャッシュし、再実行を高速化。
Database Buffer Cacheデータファイルから読み込まれたブロックをキャッシュ。キャッシュヒット時は高速、ミス時はディスクから読み込み。
Redo Log Buffer更新操作の変更履歴を記録。障害復旧時に使用される。
Large Pool(任意)RMAN(バックアップ/リストア)やMTS用の大きなメモリ割り当てに利用される。
Java PoolOracle JVM用。Javaコードやセッションデータ格納。
Streams PoolOracle Streamsのメッセージや適用処理用。

🧾 Data Dictionary(データ辞書)

  • データベース構造・ユーザ・権限などのメタ情報を保持。

  • データベース操作時に頻繁に参照され、SYSスキーマが保持する。

  • 一部は永続ストレージ(ALL_TABLESなど)に保存され、他は動的(V$ビューなど)でメモリ上に存在。

  • V$PDBSV$SESSION は代表的な動的ビュー。


🔄 SQL文とキャッシュ

  • 同じSQLが複数のユーザから発行される場合、Shared SQL Area が再利用され、解析・実行計画の再生成が不要。

  • SELECTにヒントを付ければ結果キャッシュが使用可能。


📦 データキャッシュの詳細

🔸 Database Buffer Cache

  • Oracleブロック単位でキャッシュ(1ブロック = Oracleの最小読み書き単位)。

  • キャッシュヒット:メモリから直接データ取得 → 高速

  • キャッシュミス:ディスクから読み込み → バッファに格納 → メモリから提供

  • 変更されたブロック(Dirty Buffer) はバックグラウンドプロセス Database Writer (DBWn) によってディスクに書き戻される。


🔸 Redo Log Buffer

  • すべての変更(INSERT、UPDATE、DELETEなど)のログを保持。

  • 循環バッファ構造。満たされたら最初から上書き。

  • Log Writer (LGWR) プロセスが定期的に REDOログファイル に書き込む。

  • 障害復旧に不可欠。


🧮 その他のメモリ領域と構成

🔹 PGA(Program Global Area)

  • サーバプロセス専用のメモリ領域(SGAとは非共有)

  • ログインセッション・SQL処理用のワーク領域を保持

  • 専用サーバモード:セッションごとに1つのPGA(→ UGAはPGA内)

  • 共有サーバモード:UGAはSGA内に配置される(Shared PoolやLarge Pool)


👤 ユーザーと処理フローの例

ユーザーA~Dの例で解説:

  • ユーザーASELECT 文発行 → ライブラリキャッシュ&データ辞書参照 → 結果取得

  • ユーザーB:同じSQL実行 → キャッシュを活用し高速化

  • ユーザーCSELECT /*+ RESULT_CACHE */ → 実行結果をキャッシュし、次回は即応答

  • ユーザーD:PL/SQL関数に RESULT_CACHE → 同一引数での再呼び出しは実行不要


🔚 まとめ:Oracleインスタンス構造図イメージ

+----------------------------+
|        Oracle Instance     |
|                            |
| +----------+  +----------+ |
| |   SGA    |  |  BG Proc | | ← メモリ領域&バックグラウンドプロセス
| +----------+  +----------+ |
+----------------------------+

SGA構成例:
- Shared Pool(Library, Data Dictionary)
- Buffer Cache(DBブロック)
- Redo Log Buffer(変更履歴)
- Large Pool, Java Pool, Streams Pool

PGA構成例:
- セッション情報、ソート、結合、ログオン情報など(個別プロセス単位)


 🧠 Oracle Database のメモリ管理

🔹 概要:メモリ管理とは?

Oracleデータベースにおけるメモリ管理とは、インスタンス内のメモリ構造(SGAやPGA)のサイズを最適に保ち、パフォーマンスを向上させるための仕組みです。


🔧 メモリ管理の3つのモード

モード概要特徴
① 自動メモリ管理(AMM)MEMORY_TARGET のみを指定するだけで、OracleがSGAとPGAの両方を自動調整する。完全自動。最も推奨される(特に小規模~中規模環境)。
② 自動共有メモリ管理(ASMM)SGA_TARGETPGA_AGGREGATE_TARGET を個別に設定し、SGA内部は自動調整される。SGAは自動、PGAは手動。4GB以上の大規模システムで推奨。
③ 手動メモリ管理SGAやPGAの各コンポーネント(例:DB_CACHE_SIZE)をすべて個別に設定。細かいチューニングが可能だが、専門知識が必要。

💡 現在の設定確認と切り替え手順

✅ 設定確認方法

SHOW PARAMETER コマンドや、SQLで確認可能。

sql

SHOW PARAMETER MEMORY;

  • MEMORY_TARGETMEMORY_MAX_TARGET0でなければAMM(自動メモリ管理)

  • SGA_TARGETPGA_AGGREGATE_TARGET が有効なら ASMM(自動共有メモリ管理)

🔄 切り替え手順(例:AMM→ASMM)

  1. バックアップのため、サーバパラメータファイル(SPFILE)をテキスト形式にエクスポート

    sql
    CREATE PFILE='/tmp/init.ora' FROM SPFILE;
  2. MEMORY_TARGET を 0 に設定

  3. SGA_TARGETPGA_AGGREGATE_TARGET に適切な値を設定

  4. インスタンスを再起動(SGA_TARGET 変更時は必須)

    ※ASMM は SGA + PGA 合計が 4GB以上ある場合に推奨される。


🔁 AMM に戻すには?

  • MEMORY_TARGET に合計値を指定

  • Oracle が SGA と PGA の両方を自動で調整してくれる


📈 パフォーマンス監視:自動メモリ管理のチューニング

  • 実運用後に負荷に応じて調整が必要な場合、以下のビューを使用:

sql

 SELECT * FROM v$memory_target_advice;

  • memory_size_factor = 1 が現在の設定

  • 他の行は、異なるメモリサイズにした場合の予測完了時間(パフォーマンスへの影響)を示す


🧠 Oracle インスタンスと主なバックグラウンドプロセスの仕組み

🔸 Oracle インスタンスとは?

  • Oracleインスタンスは、Oracleサーバーマシン上の メモリ(RAM) 内に構築される構造。

  • 2つの構成要素からなる:

    • Memory structures(SGAなどの共有メモリ領域)

    • Background processes(自動で起動される補助プロセス)


🔹 プロセスの種類

種類内容
ユーザープロセスアプリやツールがOracleに接続する際に動作。リモートから接続されることも。
サーバープロセスユーザープロセスのリクエストを処理。Listenerによって専用に作成される(専用サーバーモードの場合)。
バックグラウンドプロセスOracleが自動で起動。様々な補助処理(書き込み、同期、リカバリなど)を行う。v$bgprocess ビューで確認可能。

🔧 主なバックグラウンドプロセスの役割

DB Writer(DBWn)

  • データベースバッファキャッシュ(SGA内)「変更済み(ダーティ)」ブロックをディスクに書き出す。

  • 書き出しタイミングはチェックポイントと呼ばれるイベントで発生。

Checkpoint(CKPT)

  • DBWn の書き込みタイミングを監視。

  • 制御ファイルやデータファイルのヘッダーにチェックポイント情報(SCNやREDOログ位置)を記録。

  • SCN: システム変更番号。これによりデータの同期が保証される。

Log Writer(LGWR)

  • REDOログバッファの内容をディスク上のREDOログファイルに書き込む。

  • 書き込みタイミング例:

    • トランザクションのコミット時

    • REDOログバッファが1/3満杯

    • ログスイッチ時

    • DB Writer がディスクに書き込む前

    • 3秒経過後

Write Ahead Protocol:DBWnより前にLGWRが書き込む必要がある。

アーカイバ(ARCn)

  • アーカイブログモード時に、ログスイッチのたびにREDOログを**アーカイブログ(別ファイル)**に退避。

  • メディア障害時のリカバリに必要。

System Monitor(SMON)

  • インスタンス障害(例:停電)時に、再起動後にコミット済みトランザクションを反映し、未コミットはロールバック

  • 一貫性を回復。

Process Monitor(PMON)

  • 異常終了したユーザーセッションのリソース(ロック、セッション情報など)を自動クリーンアップ

Listener Registration Process(LREG)

  • インスタンスやディスパッチャープロセスの情報をOracle Net Listenerに登録。


🔁 トランザクション処理の流れ(ユーザーのCOMMIT時)

  1. アプリケーションがユーザープロセスを作成、接続要求。

  2. リスナーが専用サーバープロセスを作成。

  3. ユーザーがSQL(SELECT, UPDATEなど)を発行。

  4. Shared Poolに同一SQL文の共有領域があるか確認し、あれば再利用。

  5. データ取得 or 修正

    • キャッシュにあればそのまま利用

    • なければディスクから取得

  6. 変更はSGA内で実施

  7. COMMITが実行されると、LGWR がREDOログに書き込み

  8. ユーザーへ成功メッセージが返される。

  9. DBWn は、効率的なタイミングでデータを最終的にディスクへ書き出す


✅ その他ポイント

内容説明
REDOログの構成最低2グループが必要。グループごとにファイルがあり、ログスイッチで順次書き込み先が変わる。
グループコミット高負荷時に複数のトランザクションをまとめてREDOログに書き込むことでI/Oを効率化。
Fast Commit MechanismCOMMIT成功時、即REDOログに書き込み→データのディスク書き込みは後回し。

🧩 Oracle Multitenancyとは何か?

🔸 解決したい課題

  1. 複数データベースの非効率なリソース利用

    • サーバごとに個別のDBを動かすと、リソースが無駄になりがち。

  2. DBAの管理負担が大きい

    • 各DBを個別にパッチ適用・メンテナンスする必要がある。


🧱 Multitenantアーキテクチャの構造

Oracle Multitenancyでは、1つのOracleデータベースを CDB(Container Database) として動かし、
その中に複数の PDB(Pluggable Database) を格納します。

🔹 主な構成要素

コンポーネント説明
CDB$ROOT(ルートコンテナ)Oracleのシステムメタデータ(辞書、共通ユーザー、PL/SQLパッケージなど)を保持。ユーザーデータはここに作らない。
PDB$SEED(シードPDB)新しいPDBを作る際のテンプレート。変更・追加はできない。
ユーザー作成PDB(例: SALES, HR)実際のアプリケーション用データベース。1つのPDBは1つのアプリケーションに対応させる想定。

🔧 Multitenantのメリットと特長

項目内容
アプリの互換性PDBに接続したアプリは、通常のスタンドアロンDBと区別がつかない。
管理の簡素化パッチ・アップグレードはCDB単位で行えば、すべてのPDBに反映される。
リソースの統合1つのインスタンス・SGA・バックグラウンドプロセスで複数DBを運用可能。
アーキテクチャの一貫性ルートコンテナは共通辞書を管理、各PDBは独自のデータ辞書を持つ。

🗃️ 各種構成のポイント

機能内容
REDOログCDB全体で1つのREDOログファイル。どのPDBで変更が起きたかはログに記録される。
アーカイブログモードCDB単位で有効。全PDBに適用される。
コントロールファイルCDB単位で共通。PDB追加時の情報も含まれる。
UNDO表領域共有UNDOまたは各PDBのローカルUNDOが選択可能。
👉ローカルUNDO推奨:PDB単位でポイントインタイムリカバリ可能
テンポラリ表領域共通のテンポラリ表領域に加え、各PDBがローカルな一時表領域を持つことも可能。
データディクショナリ各コンテナ(CDB$ROOT/PDB)に固有のSYSAUX/SYSTEM表領域に格納される。