Oracleと十数年付き合ってきたDBAとして、私は常にある現象に気づいています。それは、入門者から数年の経験を持つ開発者に至るまで、多くの人々がOracleの最も基礎的かつ核心的な二つの概念、「インスタンス(Instance)」と「データベース(Database)」の理解が曖昧で、時にはそれらを同一視してしまっていることです。この概念的な混乱は、Oracleの起動、運用、停止のメカニズムを真に理解することを妨げ、深いパフォーマンス診断を行う上での障害となります。
本記事では、単に教科書的な定義を羅列するのではなく、インスタンスとデータベースの階層構造を示し、それぞれが独立した存在でありながらどのように協調して動作するのかを明らかにしていきます。これを読めば、Oracleに対する根本的に新しい視点を得られるでしょう。
I. インスタンスとデータベースの関係とは
まず、この二つの概念を徹底的に明確にしましょう。
- データベース (Database): ディスク上に物理的に格納されている一連のファイル群を指します。それは静的です。主に三種類のファイルが含まれます:
- データファイル (Data Files): テーブルやインデックスなどのユーザーデータが実際に格納される場所です。
- 制御ファイル (Control Files): データベースの物理構造、データファイル、ログファイルの位置などのメタデータを記録します。
- REDOログファイル (Redo Log Files): 「台帳」であり、データベースに加えられた全ての変更を記録し、リカバリに使用されます。
- インスタンス (Instance): メモリ内の一連のデータ構造と、バックグラウンドで実行されているプロセスの集合を指します。「動的」でアクティブに動作し、データベースファイルへアクセスし操作を行うための唯一の経路となります。主に二つの部分から構成されます:
- メモリ構造 (Memory Structures): 主にシステムグローバル領域(SGA)とプログラムグローバル領域(PGA)です。
- バックグラウンドプロセス (Background Processes): 例えばDBWnやLGWRなどで、実際に作業を行う「労働者」です。
この関係をより明確にするために、私は「レストランの厨房」と「レシピ本および食材倉庫」という比喩を好んで使います。
データベースは、レストランのレシピ本(制御ファイル)と巨大な食材倉庫(データファイル)のようなものです。それらは静かにそこにあり、それ自体が料理を作り出すことはできません。
インスタンスは、設備が整い、明るく照らされた厨房であり、様々な作業台(SGAメモリ)、シェフの個人用具(PGAメモリ)、そして忙しく働くシェフたち(バックグラウンドプロセス)がいます。
- 厨房(インスタンス)が稼働して初めて、シェフたち(プロセス)はレシピ本(制御ファイル)に従って食材倉庫(データファイル)から食材を取り出し、調理(データ操作)を行い、料理の各ステップを記録(REDOログ)することができます。一つのデータベースは複数のインスタンス(RACクラスタ)からアクセス可能で、これは一つの大きな食材倉庫が同時に複数の厨房に供給できるのと同じです。
さて、簡単なSQLクエリでこの二つの違いを直感的に見てみましょう。
-- 現在接続しているインスタンス情報を確認
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
-- インスタンスに関連付けられているデータベース情報を確認
SELECT NAME, OPEN_MODE FROM V$DATABASE;
通常、インスタンスのステータスはOPEN
、データベースのオープンモードはREAD WRITE
と表示されます。これは、あなたの「厨房」が営業中であり、「食材倉庫」に対して読み書き操作が可能であることを意味します。
II. インスタンスの核心:メモリとプロセス
インスタンスがデータベースを操作する唯一の入口である以上、その内部を深く探り、この「厨房」がどのように機能しているのかを見る必要があります。
メモリ構造:SGAとPGAの効率的な連携ゾーン
SGA(System Global Area)は、インスタンス内で最大かつ最も中心的なメモリ領域であり、全てのサーバープロセスとバックグラウンドプロセスによって共有されます。厨房の共用エリアと考えてください。
-- SGAの主要な構成要素とそのサイズを確認 (SQL*Plusでは SHOW SGA がより一般的)
SELECT NAME, BYTES/1024/1024 AS "SIZE(MB)" FROM V$SGAINFO;
その中で最も重要なコンポーネントは以下の通りです:
- データベースバッファキャッシュ (Database Buffer Cache): SGAの中で最大の領域です。データを読み書きする際、Oracleはまず関連するデータブロックをディスクのデータファイルからこのキャッシュに読み込みます。その後の操作はこのメモリ領域で直接行われるため、パフォーマンスが大幅に向上します。
- 共有プール (Shared Pool): 主にSQL文の実行計画やPL/SQLプログラムコードなど、複数のユーザー間で共有可能な情報を格納します。ユーザーがSQLを実行すると、Oracleはまず共有プール内に全く同じSQLが以前に実行されたかを探します。もしあれば、その実行計画を再利用し、時間のかかる解析プロセスを省略します。これが「一度解析すれば、何度も実行できる」の核心です。
- REDOログバッファ (Redo Log Buffer): 全てのデータ変更記録(Redo Entry)をキャッシュするための一時的なメモリ領域です。DML操作(INSERT, UPDATE, DELETE)によって生成されたデータ変更は、まずここに高速に書き込まれます。
一方、PGA(Program Global Area)は各サーバープロセス専用のプライベートなメモリ領域で、ソートデータやセッション情報などを格納するために使用されます。これは、各シェフ専用の小さな作業台や道具箱のようなもので、他のシェフは触ることができません。
バックグラウンドプロセス:インスタンスの「五大働き者」
SGAが作業台だとすれば、バックグラウンドプロセスは疲れ知らずのシェフです。Oracleには数十のバックグラウンドプロセスがありますが、以下の五つは知っておくべき「働き者」です:
- DBWn (Database Writer): 主な役割は、バッファキャッシュ内で変更されたデータブロックを、適切なタイミングでディスク上のデータファイルに書き込むことです。変更のたびにすぐ書き込むのではなく、まとめて処理することでI/O効率を高めています。
- LGWR (Log Writer): REDOログバッファ内の変更記録をディスクのREDOログファイルに迅速に書き込む役割を担います。データの永続性は主にこれによって保証されます。LGWRの書き込みが成功すれば、トランザクションはコミットされたと見なされ、インスタンスがクラッシュしてもデータは失われません。
- CKPT (Checkpoint): 特定のイベントがトリガーされた際に、全てのデータファイルと制御ファイルのヘッダ情報を更新し、「チェックポイント」位置を記録する信号係です。この位置は、それ以前の全ての変更されたブロックがDBWnによってディスクに書き込まれたことをOracleに伝えます。これにより、クラッシュ後のリカバリ時間が大幅に短縮されます。
- SMON (System Monitor): データベース起動時にインスタンスリカバリを実行したり(必要な場合)、不要になった一時セグメントをクリーンアップしたりするなどのシステムメンテナンス作業を担当します。
- PMON (Process Monitor): ユーザープロセスが異常終了した際に、そのプロセスが使用していたリソース(コミットされていないトランザクションのロールバック、ロックの解放など)をクリーンアップする役割を担います。
以下のクエリで、これらのプロセスを確認できます:
-- 主要なバックグラウンドプロセスを確認
SELECT NAME, DESCRIPTION
FROM V$BGPROCESS
WHERE PADDR IS NOT NULL
AND NAME IN ('PMON', 'SMON', 'DBW0', 'LGWR', 'CKPT');
III. UPDATE文の相互作用
理論の説明は終わりましたので、実際のUPDATE
文を通して、インスタンスとデータベースの相互作用のプロセスをつなげてみましょう:
UPDATE employees SET salary = 6000 WHERE employee_id = 100;
- 接続と解析: SQLクライアントがリスナー経由でデータベースに接続し、Oracleはサーバープロセスを割り当てます。サーバープロセスはまず共有プールにこの
UPDATE
文の実行計画があるかを確認し、なければハードパースを行ってキャッシュします。 - データの読み込み: 実行計画に基づき、サーバープロセスはまずバッファキャッシュ内で
employee_id = 100
が含まれるデータブロックを探します。見つからなければ、ディスク上のデータファイル(V$DATAFILE
で確認可能)からそのデータブロックをバッファキャッシュに読み込みます。 - 変更記録の生成: PGAで変更操作を実行し、給与を6000に変更します。同時に、REDOログバッファにこの変更の「ビフォーアフター」を記述した詳細な変更記録(Redo Entry)を生成します。
- データブロックの変更: サーバープロセスはバッファキャッシュ内のデータブロックを変更し、「ダーティブロック」としてマークします。この時点では、ディスク上のデータファイルはまだ変更されていません。
- トランザクションのコミット (COMMIT):
COMMIT
を実行すると、LGWRプロセスが起動され、REDOログバッファ内のこのトランザクションに関連する全ての変更記録をディスク上のREDOログファイル(V$LOGFILE
で確認可能)に即座に書き込みます。この書き込みが成功した時点で、トランザクションは永続的と見なされます。 - バックグラウンドでの書き込み: その後、あるタイミング(例えばチェックポイント発生時やバッファキャッシュの空き容量不足時)で、DBWnプロセスがバッファキャッシュ内の「ダーティブロック」を見つけ、対応するディスクのデータファイルに書き戻し、データの最終的な永続化を完了します。
IV. 起動プロセスから本質を見る:NOMOUNT, MOUNT, OPENの秘密
Oracleの起動プロセスの三段階を理解することは、インスタンスとデータベースの関係を完全に把握するためのベストプラクティスです。
STARTUP NOMOUNT
:- 何が起こるか: Oracleがインスタンスを作成します。つまり、パラメータファイル(pfile/spfile)に基づいてSGAメモリを割り当て、バックグラウンドプロセスを起動します。
- 状態: この時点ではインスタンスのみが存在します。しかし、どのデータベースのために働くべきかはまだ知りません。
- 検証:
V$INSTANCE
を問い合わせると結果が返りますが、V$DATABASE
を問い合わせるとエラーになります。なぜなら、制御ファイルがまだ読み込まれていないからです。
ALTER DATABASE MOUNT
:- 何が起こるか: インスタンスはパラメータファイルの
control_files
パラメータに基づいて制御ファイルを見つけて開きます。制御ファイルを読み込むことで、インスタンスはデータベース名、データファイル、ログファイルの位置などの情報を知ります。 - 状態: 制御ファイルを手に入れ、食材倉庫の場所は分かりましたが、まだ倉庫の扉は開けていません。
- 検証:
V$INSTANCE
とV$DATABASE
の両方が結果を返しますが、データベースのOPEN_MODE
はMOUNTED
です。この時点でV$DATAFILE
やV$LOGFILE
を照会してファイルリストを確認できます。
- 何が起こるか: インスタンスはパラメータファイルの
ALTER DATABASE OPEN
:- 何が起こるか: インスタンスは全てのデータファイルとREDOログファイルを開き、一貫性チェックを行います。必要であれば、SMONがインスタンスリカバリを実行します。
- 状態: 「厨房」が正式に営業開始!全ての食材倉庫の扉を開け、サービスを提供できる状態になりました。
- 検証:
V$DATABASE
のOPEN_MODE
がREAD WRITE
に変わります。データベースはこれで完全に利用可能になります。
まとめ
この「厨房ツアー」を通じて、皆さんがOracleのアーキテクチャについて明確な理解を得られたことを願っています。以下の要点を覚えておいてください:
- データベースは静的な物理ファイルの集合であり、本体です。
- インスタンスは動的なメモリとプロセスの組み合わせであり、「機能」にあたります。
- データベースを直接操作することはなく、すべての操作はインスタンスを介して実行されなければなりません。
- SGAは中心的なワークスペースであり、バックグラウンドプロセスは核心的な労働力です。これらが一体となって、効率的な「データ処理工場」であるインスタンスを形成しています。
この関係を理解すれば、将来データベースのパフォーマンス問題を調査したり、待機イベントを分析したり、バックアップ・リカバリ戦略を設計したりする際に、頭の中に明確な実行設計図が描けるようになるでしょう。