アーキテクチャとは?
「アーキテクチャとはソフトウェアの内部構造」です。
システムを構築する時は、必ず何かしらの「目的」があります。
例えばカラオケをするシステム、写真を加工するシステムなど。
その目的を実現するための内部構造をアーキテクチャと言います。
一般的な企業では業務にデータ処理は欠かせない
一般的な企業はたくさんのデータを持っていて、データを処理することで業務を遂行しています。
逆に言うとデータが全くないと何をしていいのやら分からなくなると思います。
その「データ処理」は RDBMS が中心的な役割を果たしています。
- RDBMS ← Relational Database Management System(関係データベース管理システム)
Oracle のアーキテクチャに関する知識が必要な理由
Oracleは柔軟に「システム設計」や「物理設計」が行えます。
例えば以下の項目についてチューニングできます。
- データベースを構成するファイルのサイズ
- 初期起動プロセス数
- 最大プロセス数
- 処理に利用されるメモリのサイズ
などです。
柔軟な設計ができるということは、時にはパフォーマンスを最大化することができる反面、チューニングの結果パフォーマンスが落ちることも考えられます。
そのために各項目をチューニングすることにより、得られる効果を知っておく必要があります。
だからこそ Oracle のアーキテクチャの知識が必要になります。
データベースとインスタンス
- データベース ← データファイルや制御ファイルなどのデータを格納するファイル群
- インスタンス ← SGA(System Global Area:システムグローバル領域)と呼ばれるメモリ領域とバックグラウンドプロセス群から構成される
通常は「データベース」と「インスタンス」は1対1で構成されます。
データベース
データベースは以下のファイルで構成されています。
- 1つ以上のデータファイル
- 2つ以上のREDOログファイル
- 1つ以上の制御ファイル
データファイル
データを格納するファイルが「データファイル」です。
データファイルには以下のデータが格納されます。
- ユーザーが作成した「テーブル」や「索引」などのデータ(商品Aの定価300円など)
- UNDOデータ(過去のデータ)
- 一時データ(一時作業に使われるデータ)
- システムの管理データ
データファイルを通常のファイルなので OS のコマンドで実体を確認することができます。
テーブルスペース(表領域)
Oracle ではテーブルスペースを作成し、その中にテーブルを格納します。
実際は複数のデータファイルで構成されています。
テーブルスペース(表領域)は 1 つ以上の「データファイル」をグルーピングした論理的な記憶領域です。
- データファイル ← 物理的、実体あり
- 表領域 ← 論理的、実体なし(Oracle上の記憶領域)
■表領域の種類
- 永続表領域 ← テーブルや索引などのオブジェクトを格納するためのデータ保存用の表領域
- UNDO 表領域 ← UNDO 情報の格納にのみ使用する特別な表領域。テーブルや索引などのオブジェクトを格納することはできない
- 一時表領域 ← SQL 処理に使われる一時作業用の特別な領域。テーブルや索引などのオブジェクトを格納することはできない
UNDO 表領域
UNDO は「アンドゥ」と読みます。(ウンドゥと言っている人は見たことがありません)
UNDO 表域は「UNDO セグメント」を格納するための専用の領域です。
UNDO 表領域にはデータベースの更新をロールバックするための情報が格納されています。
トランザクションが開始されると、そのトランザクションは、自動的に特定の UNDO セグメントに割り当てられます。
そのトランザクションで更新したデータの、更新前のデータは、トランザクションに割り当てられた UNDO セグメントに保管されます。
Oracle 8i では「ロールバックセグメント」と呼ばれていました。
永続表領域
永続表領域は
- Oracle の動作に必要な特殊な表領域
- データ格納用永続表領域
の 2 つに分かれます。
■Oracle の動作に必要な特殊な表領域
- SYSTEM 表領域 ← Oracle の動作に必要な管理情報を持つデータディクショナリが格納されています。
- SYSAUX 表領域 ← データベースの動作に必要な管理情報が格納されています。
「SYSTEM 表領域」や「SYSAUX 表領域」にユーザ作成のオブジェクト(テーブル、索引)を格納することもできますが、通常は格納しません。
■データ格納用の永続表領域
この表領域にアプリケーションで使用するテーブルや索引(インデックス)を格納します。
REDOログファイル
REDOログファイルにはデータベースの更新履歴が書き込まれます。
Oracleは複数のREDOログファイルをローテーションして更新履歴を書き込むので、1つのデータベースに対して最低でも2つのREDOログファイルが必要です。
制御ファイル
制御ファイルには、データファイルやREDOログファイルの格納場所(パス)や、各ファイルの最終更新時刻などの制御情報が保存されます。
インスタンス
インスタンスは以下の2つで構成されます。
- SGA(System Global Area:システムグローバル領域)と呼ばれるメモリ領域
- バックグラウンドプロセス
SGA(System Global Area)
以下より構成されるプロセス間で共有するメモリ領域です。
- データベースバッファキャッシュ
- REDOログバッファ
- 共有プール
- ラージプール
- Javaプール
バックグラウンドプロセス
インスタンスの起動に合わせて起動する一組のプロセス群です。
主にプロセスの監視やファイルへのデータ書き出しなど裏方的な処理をしています。
バックグラウンドプロセスのプロセス名には「ora_」が付いています。
DBCA(Database Configuration Assistant)とは
- Oracle9i ← CREATE DATABASE 文を発行してデータベースを作成
- Oracle10g ← DBCA(Database Configuration Assistant)を利用してデータベースを作成
DBCA は「コマンドライン」ツールではなく、「GUI」のツールです。
DBCA で出来ること
- データベースの作成
- データベースの構成の変更
- データベースの削除
- テンプレートの管理
- PDB の管理
DBCA でデータベースを作成した時の表領域
表領域名 | 種類 | 説明 |
---|---|---|
SYSTEM | 永続 | Oracleに必須の表領域。データベースの管理情報が格納される特殊なテーブルであるデータディクショナリが格納されます。ユーザーが作成したテーブルや索引などのオブジェクトを格納しないようにします。 |
SYSAUX | 永続 | SYSTEM表領域の補助表領域であり、Oracle 10g以降の Oracle に必須の表領域です。SYSTEM 表領域と同様に、ユーザーが作成したテーブルや索引などのオブジェクトを格納しないようにします。 |
UNDOTBS1 | UNDO | データベースが使用する UNDO 表領域です。 |
TEMP | 一時 | データベースのデフォルト一時表領域です。 |
USERS | 永続 | 一般ユーザーのオブジェクト格納用の表領域です。 |
SQL*PlusなどクライアントがOracleを使用する仕組み
SQL*Plus などのクライアントがOracleを使用する場合は、初めにインスタンスに接続します。
インスタンスは複数起動していることがありますが、インスタンスにはそれぞれ「SID」という識別子が設定されているので、SIDで接続するインスタンスを指定します。
1台のDBサーバーに2つのデータベース「TEST」「PROD」が存在する場合、「TEST」と「PROD」という2つのインスタンスが存在することになります。
インスタンスへのアクセス
SQL*Plusからインスタンスへ接続するコマンド
$ sqlplus /nolog ← SQL*Plusを起動します。
SQL> connect / as sysdba ← SYSDBA権限でデータベースに接続します。 |
インスタンスの起動
インスタンスが起動していない場合は以下のコマンドでインスタンスを起動します。
SQL> STARTUP |
クライアントアプリケーションとサーバープロセスとリスナー
- クライアントアプリケーション ← Oracle利用者が実際に起動しSQLを発行する
- サーバープロセス ← 発行されたSQLを処理する
- リスナー ← クライアントアプリケーションから送信されたインスタンスへの接続要求を受け付けるプロセス
リスナー
リスナーはクライアントアプリケーションがネットワーク経由でインスタンスへの接続要求を受け付けるプロセスです。
そのため、クライアントアプリケーションがネットワーク経由でインスタンスに接続する場合は、インスタンスが起動しているサーバー上に「リスナー」が起動している必要があります。
接続を受け付けたリスナーは、接続後の処理をサーバープロセスに引き継ぎます。
クライアントアプリケーションとサーバープロセスは接続することを「セッションが確立する」と言います。
ローカル接続しかしない場合はリスナーを起動する必要はありません。
調査方法
- STATSPACK ← DB全体の稼働状況を大まかに把握することができます。Oracle の CPU 使用時間や I/O 情報、リソースを大量に消費する SQL 文の情報を収集できます。また、収集する統計情報の粒度を「レベル」によって調整できます。
- V$表(動的パフォーマンスビュー) ← STATSPACK よりミクロな単位で状況を把握できます。
- V$SESSION_WAIT ← DBに接続して処理を実行中の各セッションの待機状況(待ち状態)を確認できます。競合してボトルネックになっているリソースが分かります。
- V$SESSION ← DBに接続している各セッションの稼働状況を表示ます。どのようなアプリケーションがどのタイミングでどういう SQL を実行しているかを把握できます。Oracle 10g から V$SESSION_WAIT ビューの情報も V$SESSION のビューに集約されています。
- V$LOCK ← ロック情報を取得できます。
V$の各種情報は STATSPACK とは異なり、情報を取得したその瞬間の DB の情報を取得します。
STATCKPACKについて
デフォルトはレベル 5 です。
STATSPACK はレベル 0 ~ 10 までレベルを調整することができます。
Oracle の待ち状態が増加したからと言って Oracle が原因とは限らない
CPU リソースが枯渇したり、ディスク I/O が遅延してすると STATSPACK では Oracle の待ち状態(待機状態)が増加します。
そのため、パフォーマンスが低下すると、真っ先に Oracle が疑われることがよくあります。
しかし正確な原因は STATSPACK と OS の各種情報(vmstat,top,psコマンド等)を突き合わせて行なう必要があります。
V$SESSION の情報
- USERNAME ← Oracle に接続している DB ユーザー名
- MACHINE ← Oracle に接続しているマシン名
- MODULE ← Oracle に接続しているモジュール名
現在勉強している本
インフラという業務の宿命なのか?それとも単純に私がいろんな仕事をしたがる性格なのか分かりませんが、現在は Oracle の勉強をしています。(本音を言えばPythonでプログラムを作っている方が楽しいですが・・・)
職場の DB のスペシャリスト達からも太鼓判を押された Oracle の仕組みが理解できる技術本です。
プロとしてのOracleアーキテクチャ入門【第2版】(12c、11g、10g 対応) 図解と実例解説で学ぶ、データベースの仕組み (Oracle現場主義)
新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
コメント