RDBMS for Oracle9i

目次

ここでは基本的なOracleデータベースの理論的側面と物理的側面について説明します。

Oracleアーキテクチャ
データベース オブジェクト

セッション管理

戻る

Oracleアーキテクチャ

Oralceのコンポーネントは3つの基本領域にわかれており、それぞれoracleサーバーの稼働するサーバーの3つの基本領域に対応しています。そのコンポーネントを下記にまとめました。

メモリー
OracleSGAといい、この領域は全てのユーザーにより共有されます。OracleSGAはいくつもの要素で構成されており各要素はその目的に応じて設計されています。

バッファキャッシュ ユーザーがデータの表示や更新が出来る様に、Oracleデータをメモリーに格納します。これによりユーザーがディスクファイルを直接変更する事はありません。ユーザーに変わってOralceが適切なデータをメモリーに読み取り、ユーザーが変更を行った後のコミットの時点で変更内容をディスクに書き込みます。バッファキャッシュ内の情報はOracleに同時に接続する全てのユーザーで共有されます。
REDOログバッファ REDOという特別な情報が格納されています。この情報はシステムに障害が発生した時にOracleがデータの変更内容を再構築する際に使用されます。REDO情報は、ユーザーがデータを更新したときにログバッファに書き出され、Oracleによってディスクに書き込まれるまでログバッファに貯えられています。 
共有プール 使用済みのSQL文を他のユーザーが再利用できるように格納しておくためのライブラリキャッシュで、メモリー内のOralceデータディクショナリ情報を素早くアクセスできる様に格納しておく為のディクショナリキャッシュなどがあります。
ラージプール Oracleバックアップ、リストア処理、I/Oサーバー処理、および共有サーバーに対するセッションメモリーのサポートに使用されているサイズの大きいメモリー割り当て領域を意味します。 
その他のメモリー領域 Javaプールなどが例にあげられます。


ディスク
Oracleデーターファイル、REDOログファイル、制御ファイル、パスワードファイル、パラメータファイル、アーカイブログファイルがあり、これらのファイルにはOralceサーバーに格納されるデータが含まれています。

データファイル(*.dbf) 必須のディスクコンポーネントで、データディクショナリとアプリケーションのデータベースオブジェクトを格納しています。データファイルは非常に大きなサイズになる特徴をもっています。また、メモリー内のバッファキャッシュや、ディクショナリキャッシュにある情報はディスク上のデータファイルから読み込まれたものです。全てのOracleデータベースには、少なくとも1つのデータファイルが含まれます。Oracleでテーブルを作成し、行を挿入する場合、テーブルと行がデータファイルに格納されます。1つのデータファイルは1つのデータべースに関連付ける事ができます。 
REDOログファイル(*.log) 2つ以上のふぁいるが必須のディスクコンポーネントで、REDO情報を格納します。メモリー内のログバッファにある情報は最終的にこのREDOログファイルに書き込まれます。このコンポーネントはOracleデータベース内のデータに対する全ての変更点を記録します。このようなログは、データべースに問題が発生した場合、データをリストアするのに不可欠です。 
制御ファイル(*.ctl) 必須のディスクコンポーネントでデータベース名やOracleディスクコンポーネントの位置に関する情報を格納します。制御ファイルにはサーバーのファイルシステムに置けるデータファイルとREDOログの両方の物理的な位置が格納されます。Oracleデータべースには制御ファイルが複数あってもかまいません。複数あっても完全に同一のコピーとなります。これを制御ファイルのミラー化と言います。 
パスワードファイル オプションのディスクコンポーネントで、特権を持つユーザーの接続情報を保持し、データベースをOracleのデータベース管理ツールであるEnterprise Managerでリモート管理できます。
パラメーターファイル (*.ora) 必須のディスクコンポーネントで、Oracleが稼働中にどのように動作するのかを設定するためのものです。SGAのサイズ等、Oracleインスタンスの特性を定義するファイルです。
アーカイブログファイル ディスクの障害等から回復する際に必要なREDOログファイルのコピーです。

プロセス
Oracleのバックグラウンドプロセス又は個別のプロセス、サーバープロセスのスレッド。これらのプロセスによりOracleサーバーを正常に稼働させるために必要な、全てのバックグラウンド処理が実行されます。

<リクエストの流れ>
Select文が発行された場合の処理の流れは次の様になります。

1,ユーザープロセスの要求(SQL文)をサーバープロセスが受け取ります。
2,受け取ったSQL文の構文チェックを行います。データディクショナリを検索し、権限のチェックなどを行います。
3,データディクショナリから最も効率の良い検索パスを調べて実行計画を立てます。
4,実行計画を再利用可能にする為に、SQL文と実行計画をSGAの共有プールに格納します。
5,該当データがSGAのデーターべースバッファキャッシュに存在しないか調べます。
6,バッファキャッシュに存在しない場合はデータファイルから該当データを読み込み、バッファキャッシュに置きます。
7,該当のデータをユーザープロセスに返します。

DML文が発行された場合の処理の流れは次の様になります。

1,ユーザープロセスの要求(SQL文)をサーバープロセスが受け取ります。
2,該当データがSGA内のバッファキャッシュに存在するかチェックします。
3,存在しない場合には、データファイルから該当データを取り出しバッファキャッシュに置きます。
4,UNDOセグメントをSGA内のバッファキャッシュに確保します。
5,取り出したデータの該当行をロックします。
6,変更前、変更後のデータをREDOバッファログに書き込みます。
7,変更情報を、UNDOセグメントブロックに書き込みます。
8,データブロックの該当行を変更します。

<環境変数>
Oracleの実行環境に必要な環境変数があります。インストールログにも紹介しましたが、変更する場合はそれぞれ下記の項目を実行して下さい。

ORACEL_HOME
Oracleシステムのホームディレクトリです。モジュールがインストールされる元となるディレクトリであり、各PATHはこのディレクトリからの相対リンクになります。

setenv ORACLE_BASE /oracle/product
setenv ORACLE_HOME $ORACLE_BASE

ORACLE_SID
Oracleのインスタンス識別子名を指定します。これにより1つのシステム内で複数のOracleシステムを運用する事が可能です。

setenv ORACLE_SID ORACLEDB

PATH
Oralceシステムの実行モジュールが入っているディレクトリを指定します。

set PATH $PATH $ORACLE_HOME/bin

NLS_LANG (省略可)
地域を指定します。これにより出力がその地域の言語になります。また通貨や日付けなどもその地域に合わされます。

setenv NLS_LANG JAPANESE_JAPAN.JA16EUC

データベース オブジェクト

表領域>
デフォルトインストール後の表領域は次の様になっています。

SYSTEM システム管理表領域
UNDOTBS UNDOセグメント用表領域
USERS オブジェクト格納用表領域
TOOLS データベースで使用するツールをサポートする際に必要なデータベースオブジェクトと、そのツール独自の表集合を格納する表領域
TMP 一時データ用表領域

SYSTEM表領域には特別な意味があります。SYSTEM表領域にはOracleシステム全体の情報、データディクショナリが格納されています。これらの情報は、Oracleが起動している間常に自動的に更新されています。ですからSYSTEM表領域にはOracleシステムの安全性の為に、ユーザーデータは格納してはいけません。

<一時表の作成>
Oracleではデータベース内に短期間だけ存在させるテーブルを作成することができます。一時表を作成するには create global temporary tableコマンドを実行します。glocal temporaryとは全てのユーザーが使用できる様にするための表であることを意味しています。すべてのユーザーが定義を表示する事はできますが、一時表の内容は情報を一時表に追加するユーザーセッションでのみ表示することができます。

SQL> create global temporary table temp_tab (
2 empno number,
3 ename varchar2(20)
4 );

トランザクションだけの一時表の場合、一時表に入力されたデータはトランザクションの期間だけ存在します。
セッションたけの 一時表の場合、一時表に入力されたデータはセッションの期間だけ存在します。
一時表のデータはセッションに対してプライベートとなっています。つまり各セッションでは、セッションに対応する一時表に含まれるデータだけを表示したり、変更することができます。

<制約の組み込み>

PRIMARY KEY 列で制約される値が一意またはNULL値でないことが制約されています。主キーが複数の列に指定されている場合、列の値の組み合わせは一意またはNULL値でない必要があります。
FOREIGN KEY 共有列に基づいて2表間に親子関係が定義されます。子表の共有列に対して適用されますが、親表の共有列にはPRIMARY KEY制約が適用される必要があります。
UNIQUE 制約列の値に一意の値であることが制約されています。
CHECK 列に格納可能な値のリストに存在する値だけが、制約列に追加できます。
NOT NULL この列に対して値が定義されており、いずれの行に対する列にもNULL値が入る事はありません。

<コメント>
表にコメントを追加する には、COMMENT文を使用します。コメントは表、列、ビュー、スナップショットに最大2000倍とまで追加でき、データディクショナリに保管されます。COMMENT文の基本構文は、次の様になります。

SQL> comment on table [テーブル名] is 'コメント' ;

追加されたコメントはデータディクショナリビューのCOMMENTS列を通じて表示する事ができます。コメントが格納されているデータディクショナリには次の様なものがあります。

ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS

<データディクショナリ>
データディクショナリはOracleシステムによって管理されユーザーが任意に検索することができます。データディクショナリは次の4種類に分ける事ができます。

USER_ そのユーザーに関する情報が格納されています。
ALL_ そのユーザーがアクセス可能な全ての情報が格納されています。
DBA_

データベース全体の情報が格納されています。データベース監視者のみアクセスが可能です。

V$_ 動的パフォーマンスビューと呼ばれ、データベースのパフォーマンスおよびロックについての情報を格納しています。

ユーザーが所有する各種のオブジェクトはデータディクショナリを問い合わせする事で表示できます。ユーザーが所有するオブジェクトには次のようなものがあります。
USER_TABLES
USER_OBJECTS
USER_CATALOGS (CAT)

ユーザーが所有するテーブル名を表示する場合は次の様に実行して下さい

SQL> select table_name from user_tables ;

データベースオブジェクトの種類を表示する場合は次の様に実行して下さい。

SQL> select distinct object_type from user_objects ;

ユーザーが所有する表、ビュー、シノニム、順序を表示する場合は次の様に実行して下さい。

SQL> select * from cat ;

<インデックス>
インデックスは検索速度を上げる手段に用いられます。リレーショナルデータベースでは、テーブルの内容はソートされていません。一方インデックスは常に、ソートされた順序になっています。インデックスでは、データがソート済みであることが分っているので、データべースはそれを利用して、速度を上げる事ができます。下記はempテーブルのempno列のインデックスを作成しています。制約名はpempとしました。

SQL>create index pemp on emp(empno);

テーブルで主キーまたはUNIQUEキーをつけると、一意生の保証の為に、自動的にその列にインデックスが生成されます。

<シーケンス>
シーケンスは番号の順序を生成するオブジェクトです。主キーとして機能する一意番号を生成する場合などに役立ちます。下記では、初期値1から1ずつ増えるシーケンスを作成しています。

SQL> create sequence seqno
2 start with 1
3 increment by 1;

先ほど作成されたseqnoをempテーブルにインサートします。この時にnextvalを指定することで、incrementが1増加されます。

SQL> insert into emp values (
2 seqno.nextval
3 hoge ;

現在のseqnoを知りたい場合はcurrvalを指定して次の様に実行して下さい。

SQL> select seqno.currval from dual ;

<シノニム>
シノニムは、表、ビュー、シーケンスの別名です。一般にシノニムを利用する理由として、データベースオブジェクト所有者名を隠す、オブジェクトを格納した場所を隠すなどがあげられます。シノニムにはプライベートシノニムとパブリックシノニムがあり、プライベートシノニムは作成者しか利用できないのに対し、パブリックシノニムは全データべースで仕様できます。下記ではuser01というスキーマー内にあるempnoを別名、empno01というプライベートシノニムを作成しています。

SQL> create synonym empno01 for user01.empno

シノニムのオブジェクトに対しては、そのユーザーに適切なオブジェクト権限が付与されていないとアクセスできません。パブリックシノニムも同様です。下記では、user01というスキーマー内にあるempnoを別名、empno_aというパブリックシノニムを作成しています。

SQL> create public synonym empno_a for user01.empno


セッションの管理

データベースのメンテナンスを行う際には、データベースを制限モードに切り替えます。稼働中のデータベースを制限モードに変更する場合は次のコマンドラインを実行して下さい。

SQL> alter system enable restricted session;
SQL> select logins from v$instance;

LOGINS
------------
RESTRICTED

通常モードに戻す場合はdisableオプションを指定します。現行のインスタンスはV$INSTANCEの動的パフォーマンスビューで確認することができます。

SQL> alter system disable restricted session;

データベースを制限モードで起動する場合はrestrictオプションを指定します。

> sqlplus /nolog
SQL> connect sys/manager as sysdba
接続されました。
SQL> startup restrict

alter systemコマンドで制限モードに変更しても現在接続中のセッションは切断されません。ユーザーが処理を行っている最中にセッションを終了させる場合はalter system kill sessionコマンドを実行します。次の例はV$SESSIONの動的パフォーマンスビューでhogeユーザーのセッションIDとシリアル番号を確認した後に、hogeユーザーのセッションを終了しています。

SQL> select sid, serial#, status from v$session where username='hoge';

SID SERIAL# STATUS
--- ------- -------
10
15
INVALID

1行が選択されました。

SQL> alter system kill session '10,15';
システムが変更されました。
SQL> select sid, serial#, status from v$session where username='hoge';

SID SERIAL# STATUS
--- ------- -------
10
15
KILLED

1行が選択されました。

プロセスのログ
サーバープロセスとバックグランドプロセスは、実行中のエラーをトレースファイルに書き込みます。また、初期化パラメータファイルのSQL_TRACEがTRUEに設定されている場合、OracleサーバーのSQL文の実行情報もトレースファイルに書き込まれる様になります。次に、稼働中のOralceサーバーに対して、SQL_TRACEをTRUEにする方法を記します。

SQL> alter session set SQL_TRACE=TRUE;

また、Oracleサーバーは発生した全ての内部エラーをALERTファイルに書き込んでいます。アラートファイルは$ORACLE_HOME/rdbms/logのALERT_<SID>.logです。

 


<戻る>