Oracle9i 物理設計

第2部:表領域の設計

日本オラクル クロスインダストリー本部 OracleDirect SCグループ
中家 裕之

OracleDirectではインターネットと電話を利用した自席で受講できるセミナー、iSeminarを定期的に実施しております。iSeminarの内容は主に製品の紹介や、製品の有効な利用法の解説などです。2003年9月には本連載の3回目、4回目の内容を先取りしたiSeminarを実施する予定ですので、奮ってご参加ください。

◆ 第1章 表領域分割・配置の観点

表領域分割・配置の際の観点

データベースは複数の表領域で構成されます。表領域の分割を検討する際には、主に3つの観点があります。
  • 管理性
  • 耐障害性
  • パフォーマンス
次項以降でこれらの各観点について解説します。


管理性の観点

データベース管理を容易にするために、以下列挙する点に留意してください。
  • 断片化などパフォーマンスの問題が発生しにくくなる
  • ディスクの追加など表領域の再編成に伴う工数が削減できる
  • 管理者にとってわかりやすい
等のメリットが得られます。

(1)システム表領域、UNDO表領域、一時表領域は独立して作成すること
システム表領域、UNDO表領域、一時表領域は独立した表領域として作成して下さい。また、これらの表領域にはユーザーのテーブルやインデックスは作成しないようにして下さい。

(2)OMF(Oracle Managed Files)を利用する
OMFは表領域の自動管理を目的とする機能です。OMFの詳細につきましては第1部の第5章「OMF構成の紹介」を参照してください。

(3)読取専用のセグメントを別表領域に分ける
読取専用のテーブルやインデックスは読取専用の表領域に格納します。読取専用表領域に格納することで、読取専用であることが明示的にわかるようになります。また、一度バックアップを取れば、更新がないので定期的にバックアップを取る必要がなくなります。テーブルやインデックスをパーティション化してパーティション毎に表領域を分けると、更新されることのないパーティションのみ読取専用とすることもできます。

(4)格納オブジェクトで分ける
例えばテーブルとインデックスは別々の表領域に格納する、あるいは同じテーブルでも通常のテーブルとLOBテーブルは別々の表領域に格納する、といったように、オブジェクトごとに表領域を分けます。DB規模が大きいほど、後々の管理がやりやすくなります。

(5)ユーザー(スキーマ)で分ける
例えばSCOTTユーザー所有のオブジェクトとSMITHユーザー所有のオブジェクトは別々の表領域に格納する、といったように、オブジェクト所有ユーザーごとに表領域を分けます。DB規模が大きいほど、後々の管理がやりやすくなります。

(6)業務用途で分ける
例えば経理システムで使用するオブジェクトと人事システムで使用するオブジェクト、両方で使用するオブジェクトは別々の表領域に格納する、といったように、業務ごとに表領域を分けます。DB規模が大きいほど、後々の管理がやりやすくなります。


耐障害性の観点

障害が発生しにくいように、あるいは障害が発生しても影響範囲が小さくなるように、以下列挙する点に留意してください。

(1)ディスクの分割
大容量のディスクを少量用意するよりも、小容量のディスクを大量に用意し、極力データを分散させることで、障害の影響を小さくするという意味で耐障害性を確保することができます。もっとも、ディスクの大容量化によってこの対策をとることは難しいかもしれません・・・

(2)同一ディスク内でもある程度ファイルを分けて配置する
同一ディスク上でパーティション、ディレクトリ、ファイルといった単位で分けることも、ディスクを分割することに比べれば効果は小さいですが、障害範囲の極小化などといった効果はあります。

(3)データの重要度に応じて耐障害性の高いディスク装置を利用する
あまりあるケースではないと思いますが、DB内のデータの重要度に極端な差があり、その割にディスクに割ける予算が限られている場合は、重要なデータはRAID構成のディスク装置に表領域を配置し、そう重要でないデータはRAIDでないディスク装置に表領域を配置するといった手も考えられます。


パフォーマンスの観点

大容量のディスクを少量用意するよりも、小容量のディスクを大量に用意し、極力データを分散させることで、耐障害性のみならずパフォーマンスも向上させることができます。以下のような組み合わせは極力異なるディスクに配置してください。

(1)テーブルと、そのテーブルに対するインデックス
インデックスを介したスキャンが実行される場合、同じディスクにテーブルとインデックスがあると、テーブルとインデックスの間のHDDのアームの移動が頻繁に発生します。検索対象レコード数が多いほどパフォーマンスの影響が出てきます。

(2)結合対象のテーブル同士
結合方法により差がありますが、結合対象のテーブル同士の間のアームの移動が頻繁に発生します。検索対象レコード数が多いほどパフォーマンスの影響が出てきます。

(3)パラレル処理の対象になるテーブルやインデックス
パラレル処理は複数のプロセスを立ち上げて、各プロセスが同じテーブルやインデックスにアクセスするため、同じディスクに配置しているとI/Oの競合が発生し、却ってパフォーマンスが落ちることがあります。セグメントに対して複数のデータファイルを作成するか、パーティション化してデータファイルを分けるなどして、別ディスクに配置するようにしてください。

(4)システム表領域
システム表領域はその他の表領域、REDOログファイルとは異なるディスクに配置するようにして下さい。特にオブジェクト数の多いシステム、監査証跡をテーブルに記録するシステム、マルチマスタ・レプリケーションやアドバンスド・キューイングを利用するようなシステムではシステム表領域へのI/Oが多発します。システム表領域へのI/Oが多発するような場合、システム表領域自体を複数のデータファイルで作成し、データファイルを分散させると有効です。

(5)UNDO表領域
UNDO表領域はその他の表領域、REDOログファイルとは異なるディスクに配置するようにして下さい。特に更新処理の多いシステムではUNDO表領域へのI/Oが多発します。UNDO表領域へのI/Oが多発するような場合、UNDO表領域自体を複数のデータファイルで作成し、データファイルを分散させると有効です。

(6)一時表領域
一時表領域はその他の表領域、REDOログファイルとは異なるディスクに配置するようにして下さい。特に大量ソート処理の多いシステムでは一時表領域へのI/Oが多発します。一時表領域へのI/Oが多発するような場合、一時表領域自体を複数のデータファイルで作成し、データファイルを分散させると有効です。一時表領域の場合は一時表領域そのものを複数作成し、ユーザーによって利用する一時表領域を分けるという方法もあります。



◆ 第2章 ローカル管理表領域

ローカル管理表領域とは

ローカル管理表領域はOracle8iから採用された、新しいエクステント管理の方法を採用した表領域です。ローカル管理表領域に対し、旧来のエクステント管理の方法を採用した表領域のことはディクショナリ管理表領域と呼びます。両者のエクステント管理の違いは、まずディクショナリ管理表領域はその名の通りシステム表領域にあるディクショナリにてエクステントの管理を行っています。一方ローカル管理表領域は表領域のデータファイルのヘッダ部分に64KBの領域を取り、この領域でビットマップを利用してエクステント管理を行っています。Oracle9iR1からローカル管理表領域がデフォルトの表領域になりました。Oracle9iR2からはシステム表領域をローカル管理にすることができるようになりました(デフォルトはディクショナリ管理。R1ではシステム管理表領域をローカル管理にすることはできません)。


ローカル管理表領域のメリット

ローカル管理表領域はディクショナリ管理表領域に比べて多くのメリットがあります。

(1)パフォーマンスの向上
ディクショナリ管理表領域ではエクステント管理はシステム表領域で集中して行います。エクステントの追加や削除の処理はディクショナリに対するI/Oがかなり多いため、このような処理が頻発するとパフォーマンスに大きな影響が出ます。一方ローカル管理表領域はエクステント管理を各表領域で行うため、システム表領域へのI/Oは最小限に抑えられます。また、ディクショナリの更新はUNDOの生成を伴いますが、ローカル管理表領域のビットマップの更新はUNDOをほとんど生成しません。ローカル管理表領域ではディクショナリ管理表領域に比べ以下のような処理が高速になります。
  • エクステントの拡張
  • UNDOセグメントを利用する処理(更新系SQL等)
  • TRUNCATE
  • セグメントのDROP
(2)セグメントの設計・管理の簡素化
ローカル管理表領域ではエクステント管理方法の変更に伴い、エクステント管理の為のパラメータが削減されています。そのため、設計・管理が楽になります。また、エクステント確保の方法が単純になるため、その点でも管理が楽になります(詳細は(3)を参照)。ローカル管理表領域においてCREATE/ALTER TABLESPACE文で指定不要になったパラメータは以下の通りです。
  • DEFAULT STORAGE句
  • MINIMUM EXTENT
  • TEMPORARY
CREATE/ALTER TABLE、CREATE/ALTER INDEXのパラメータについては次回以降に解説します。

(3)断片化の削減
ローカル管理表領域ではエクステント確保のロジックが2種類用意されています。ひとつはデフォルトのAUTOALLOCATE指定で、セグメントサイズに従い64KB, 1MB, 8MB, 64MBのエクステントをOracleが自動で確保します。もうひとつはUNIFORM指定で、CREATE TABLESPACE時に指定した固定サイズでエクステントを確保します。AUTOALLOCATE指定の際は少数の、UNIFORM指定の際はひとつのサイズのエクステントしか作成されないため、エクステント・レベルで未使用になる領域の発生が抑えられます。

(4)表領域のコアレスが不要
ディクショナリ管理表領域では連続した空きエクステントをひとつの大きなエクステントに結合するためにコアレス(coalesce)という処理が必要でした。しかしローカル管理ではコアレスしなくても連続した空きエクステントを認識することができます。


ローカル管理表領域のデメリット

ローカル管理表領域はディクショナリ管理表領域に比べ多くのメリットがありますが、わずかながらデメリットもあります。

(1)ダイレクト処理のパフォーマンスが落ちる
ダイレクト・ロードやダイレクト・ロード・インサートといった処理は、データを一旦一時セグメントに書き込み、実際に書き込んだ大きさにて一時セグメントをテーブルないしインデックスのエクステントに変換することが高速化の一要因になっています。しかしローカル管理表領域はエクステントサイズが決まっているため、実際に書き込んだ大きさではなく決まった大きさで一時セグメントを作成しないといけないため、エクステントのフォーマッティングに関するロスが発生します。遅くなるといってもディクショナリ管理表領域に比べて遅いだけで、ローカル管理表領域上の従来パスよりは大幅に高速です。

(2)きめ細かいエクステント管理ができない
管理が簡単になる反面、テーブルやインデックスに必要な大きさにぴったりのエクステント・サイズを個別指定することができにくくなります。ディクショナリ管理表領域で必要容量をきっちり決めて管理した場合に比べると、エクステント内の未使用領域は増えがちになります。


ローカル管理表領域とディクショナリ管理表領域、どちらを使用すべき?

ローカル管理表領域はディクショナリ管理表領域に比べ多くのメリットがあることは、ここまで読んで下さった方にはご理解いただけたと思います。Oracle9iR1からは表領域のデフォルトになっているのもありますので、基本的にはローカル管理表領域を使用するようにして下さい。本連載では以降ローカル管理表領域を採用していることを前提に話を進めていきます。


ローカル管理表領域の設定に関するTips

(1)データファイルの容量見積
以下の手順で見積もります。
  1. データファイルに格納するテーブルやインデックスの見積合計サイズに余裕値を加えた値を算出します。テーブルやインデックスの見積については次回以降で解説の予定です。
  2. 1.の値を、AUTOALLOCATE指定の場合は64KBの倍数に、UNIFORM指定の場合はUNIFORM SIZEの倍数になるように切り上げます。
  3. 2.の値に表領域のヘッダとエクステント管理用のビットマップの領域として64KBを加えてください。
余裕値が十分な値であれば、2.や3.を行う必要はありませんが、この計算方法だとデータファイルが目一杯利用された時にファイルの最後に無駄な空きができません。もっとも昨今のディスク容量であれば数MBレベルの無駄があっても問題にならないと思われるので、計算が面倒であれば1.の計算だけでも十分でしょう。

(2)AUTOALLOCATEとUNIFORMのどちらを利用すべき?
AUTOALLOCATE指定はセグメント・サイズに応じたエクステントを自動で割り当てるため、UNIFORMに比べて領域が効率的に利用できます。一方エクステントサイズが何種類かになるため、エクステントの追加・開放を繰り返すうちに、エクステント間に利用できない断片化領域が発生する可能性があります。一方UNIFORM指定はエクステントサイズが固定なので非常にわかりやすいという利点があります。領域の効率的な利用については、UNIFORM SIZEの調整でそれほど無駄は出なくなります。また、UNIFORM指定は(1)の方法でサイズを設定するとエクステント・レベルでの未使用領域の断片化は発生しません。基本的にUNIFORM指定を利用することをお勧めします。AUTOALLOCATE指定は領域の指定がルーズであっても構わないと判断できるシステム(小規模システムや開発機のDBなど)、少量データ用の表領域などにお勧めです。

(3)自動拡張すべきかどうか?
基本的に自動拡張(AUTOEXTEND句)に頼るのはよくないことです。自動拡張をONにすると、ファイルのレベルで断片化が発生する可能性がありますし、何らかのSQL処理中のデータファイルの拡張は負荷が高い処理となります。データファイルとして必要な容量をきちんと見積もり、自動拡張が発生しないようにしましょう。ただ、見積をきちんとやった上で保険として設定しておくのは悪いことではありません。その際の拡張サイズはあまり頻繁に拡張が発生しないような値にしておいたほうがいいです。


◆ 第3章 システム表領域の設計

データファイルの容量見積

Partitioning Optionを追加したEnterpirse Editionにて、DBCAで表示されるオプションを一切選択せずインストールすると約200MB、逆にすべて選択してインストールすると約400MBのシステム表領域が消費されます。オブジェクト情報用のエリアも確保されていますので、基本的にはこれらの容量に余裕値を見ておけば大丈夫です。ただし、以下のようなケースでは更に容量が必要になることがあります。
  • 監査ログをテーブルに取る場合
  • レプリケーションを利用する場合
  • オブジェクト数が多くなる場合(特にストアドやパーティションなど)


ローカル管理表領域にすべきかどうか(9iR2)

ローカル管理表領域にした方がパフォーマンスに優れます。一方で以下のような制限がありますので、制限が気になる場合はディクショナリ管理にして下さい。なお、ローカル管理のシステム表領域はAUTOALLOCATE指定のみで、UNIFORM指定はできません。
  • デフォルト一時表領域の指定が必要
  • システム表領域をディクショナリ管理に変更できない
  • 新規のディクショナリ管理表領域を作成できない


◆ 第4章 UNDO表領域の設計

自動UNDO管理と手動UNDO管理の違い、選択基準

Oracle9iからロールバック・セグメントを専用に配置する表領域のことをUNDO表領域と呼びます。そしてロールバックセグメントの作成・管理をOracleまかせにする機能も追加されました。これが自動UNDO管理です。Oracle8iまでの、自分でロールバック・セグメントを作成するケースは手動UNDO管理と呼びます。Oracle9iでも手動UNDO管理を選択できます。これは初期化パラメータUNDO_MANAGEMENTで決められます。デフォルトのMANUALだと手動UNDO管理、AUTOだと自動UNDO管理になります。また、ロールバック・セグメントのことをUNDOセグメントと呼びます。

自動UNDO管理と手動UNDO管理はインスタンス起動時はどちらか片方のみしか利用することができません。起動中の切り替えもできません。従って、どちらを採用するかを設計の段階で決める必要があります。この際自動UNDO管理を選択すると、手動UNDO管理に比べて以下のようなメリットが得られます。

(1)設計・管理が容易
設計や管理が難しいロールバック・セグメントについてほとんど何も考えなくてもいいというのは、DBAの方にとっては非常に魅力が大きいと思われます。自動UNDOで設計しないといけないのは表領域の名前とデータファイルの容量、初期化パラメータUNDO_RETENTIONの値(後述)、初期に作成するUNDOセグメントの数(基本はOracleで自動計算)のみです。

(2)ORA-01555の発生の可能性が抑えられる
ある程度経験のあるDBAの方であれば、一度は大量更新処理におけるORA-01555の発生に悩まされたことがあるかと思います。大量更新処理におけるORA-01555は読み取り一貫性の為に確保されたUNDOセグメント上のデータが他のトランザクションで上書きされてから、そのデータへの参照要求が来た時に発生します。自動UNDO管理にすると初期化パラメータUNDO_RETENTIONで設定した期間中はUNDOデータが上書きされずに残るため、ORA-01555が発生しにくくなります。

(3)領域不足エラー発生の可能性が抑えられる
自動UNDO管理にすると、あるUNDOセグメントがUNDO表領域の残り領域を使い切って表領域の拡張も出来ない場合、他のUNDOセグメントに空きがあればその空きを未使用領域として開放させ、処理を継続させます。手動UNDO管理で同様の状況に陥った場合は他のロールバック・セグメントに空き領域があったとしても領域不足エラーになります。

(4)フラッシュバック・クエリーがより確実に利用できる
フラッシュバック・クエリーとは、コミットされた過去のデータを遡って見ることができるOracle9i新機能です。誤ってデータを更新してコミットしてしまった場合のリカバリに便利な機能です。手動UNDO管理でもこの機能は利用できるのですが、過去のデータ保存期間が保証されません。つまり過去のデータを見ることができるかどうかは運次第になります。自動UNDO管理にすると初期化パラメータUNDO_RETENTIONを指定できるようになり、このパラメータに設定した時間内はUNDOデータが保存されやすくなります。最終的にUNDO表領域が逼迫した場合は自動UNDO管理でも過去のUNDO情報を格納した領域を使用するのですが、自動UNDO管理にした方が手動UNDO管理に比べ、過去のUNDO情報が残りやすくなります。

こららのようなメリットがあるので、基本的には自動UNDO管理を利用されることをお勧めいたします。本連載では以降自動UNDO管理を採用していることを前提に話を進めていきます。一方、管理する要素がないということは逆に言うとパフォーマンス・チューニングの余地がないということになります。システムの事情に合わせ、パフォーマンスを目一杯追及できるのは手動UNDO管理の方です。例えば同時トランザクション数が多いのでたくさんのロールバック・セグメントを用意する、大量バッチ用に巨大サイズのロールバック・セグメントを用意する、といったケースです。パフォーマンスをシビアに追及したい場合は手動UNDO管理を利用してください。


データファイルの容量見積

自動UNDO管理の場合、UNDOセグメントを自動で作成するため、UNDOセグメントの大きさに関する見積や設定は不要です。データファイルの容量のみ見積もってください。見積式は以下の通りです。

(A × B + 64 ÷ C + D × 2) × C + 余裕値(単位:キロバイト)
A:UNDO_RETENTIONの値(0の場合は1)
B:V$UNDOSTATビューのUNDOBLKSの値を600で除算した値
    一番更新が多い時間帯のレコードを元にすること
    事前見積の場合は1秒あたりの発生UNDOブロック数を仮定
C:ブロックサイズ(2/4/8/16/32のいずれか)
D:V$UNDOSTATビューのMAXCONCURRENCYの値
    事前見積の場合は最大同時トランザクション数を仮定


初期化パラメータUNDO_TABELSPACEの設定

このパラメータには、UNDO表領域として利用したい表領域の名前を指定します。指定がない場合はシステム・ロールバック・セグメントがUNDO領域として利用される可能性があるので、自動UNDO管理の場合は必ず指定するようにして下さい。


初期化パラメータUNDO_RETENTIONの設定

UNDO_RETENTIONの値はシステムの要求に応じて決めてください。大きくする場合は確実に過去のUNDO情報を残すために、残したい量に応じてUNDO表領域の大きさを大きく設計する必要があります。

UNDO_RETENTIONのデフォルト値は900(秒)です。特に要望がなければデフォルトで構いません。また、このパラメータは

SQL> alter system set undo_retention = 1200;

と、ALTER SYSTEM文で変更が可能です。


初期UNDOセグメントの数

初期UNDOセグメントの数は初期化パラメータSESSIONSを参照して、以下の計算式で決められます。初期値は2〜10の範囲に設定されます。基本的にOracle任せで構いませんが、起動直後から大量の同時トランザクションが発生することがわかっているような場合はSESSIONSの値を大きめに取って下さい。SESSIONSの値が46以上であれば、初期UNDOセグメントの数は上限の10になります。

least(greatest(1.1 * SESSIONS / 5, 2), 10) (個)
注)leastはリスト中の一番小さな値を、greatestはリスト中の一番大きな値を返す関数です。


◆ 第5章 一時表領域の設計

テンポラリファイルを利用した専用一時表領域

Oracle9iではテンポラリファイルを利用した専用一時表領域を作成することを推奨します。他のタイプの一時表領域は、パフォーマンス面でも設計面でも選択するメリットがありません。強いて言えば旧バージョンでの一時表領域作成スクリプトがそのまま利用できるくらいです。テンポラリファイルを利用した専用一時表領域のメリットは以下の通りです。

(1)パフォーマンスがいい
テンポラリファイルを利用した専用一時表領域はREDOログを生成しないので、他のタイプの一時表領域に比べ非常にパフォーマンスに優れます。

(2)バックアップ・リカバリが高速
テンポラリファイルを利用した専用一時表領域はバックアップの対象外にできますので、その分バックアップが高速になります。テンポラリファイルを利用した専用一時表領域のリカバリはバックアップを戻すのではなく作り直しで対応します。


エクステント・サイズの見積

エクステント・サイズは初期化パラメータSORT_AREA_SIZEの倍数にブロック・サイズを加えた値がI/O効率がよくなります。どの程度の倍数にすればいいかは、OLTP系処理中心であれば数MB、DSS系処理中心であれば数十〜数百MBのエクステント・サイズを検討してください。処理内容に応じて、エクステント・サイズの異なる複数の一時表領域を作成して使い分けることも有効です。また、一時表領域を使用するトランザクションが同時に発生する場合、1つのエクステントを複数のトランザクションで共有することはないので、エクステントが大きすぎると領域の無駄が発生しやすくなります。現在確保しているエクステント数以上の同時トランザクションが発生すると、やはりエクステントの拡張が発生します。
データファイルの容量見積

一時表領域は主にメモリで処理できなかったソートの為の領域として使用されます。あるソートに必要な領域は最大でソート対象データ量の2倍程度です。一番重いソート処理の対象になるデータ容量の2倍程度に余裕値を加えた容量を確保ください。もしそのような処理が同時に複数セッションで処理されるのであれば、当然その分を見込んでおく必要があります。事前見積でどの程度の処理が走るのか予測がつかない、という場合は、とりあえずの指針として、一番大きなテーブルの容量の2倍程度を見込んでおくといいでしょう(実際にはかなりの多め見積になりがちですが)。

また、Oracle8iから利用可能な一時表は、一時表領域に作成されます。一時表を多用する場合は、特に大きな一時表をたくさん作る場合はその分を見込んでください。一時表自体の見積は通常のテーブルと同様に見積もってください。通常のテーブルの見積については次回に解説の予定です。


デフォルト一時表領域の勧め

Oracle9iより、CREATE DATABASE文を発行する際に以下の例文のようにデフォルトの一時表領域を作成することができます。

SQL> create database ...... default temporary tablespace 一時表領域名 tempfile ....

この指定がなく、かつCREATE USER文でデフォルトの一時表領域を指定しないと、システム表領域がデフォルトの一時表領域となってしまいます。システム表領域に一時セグメントを作成すると、パフォーマンスに深刻な影響を与えますし、CREATE USER時にデフォルトの一時表領域の指定を忘れてもシステム表領域に一時セグメントを作成されることがなくなるので、この指定はするようにして下さい。


◆ 第6章 データ及びインデックス用表領域の設計

UNIFORM指定の際のTips

エクステント管理方式にUNIFORM指定のローカル管理表領域を指定した場合、大きさの似たテーブル毎、あるいはインデックス毎に同じ表領域にまとめると、領域の無駄が少なくなります。


データファイルの容量見積の補足

テーブルの移動(ALTER TABLE MOVE)やインデックスの再作成(ALTER INDEX REBUILD)などを行う場合、作成先の表領域に一時セグメントを作成します。特に元のセグメントと同じ表領域にこれらの処理を行う場合、該当表領域にSQLコマンド実施後に作成されるセグメントの大きさと同じだけのスペースが余分に必要となります。
その他データファイルのサイズ見積の基本については、第2章の最後、「ローカル管理表領域の設定に関するTips」の(1)を参照してください。


◆ 第7章 第1部・第2部の説明を加味したSQL文サンプル

この章の目的

本章では前回の連載と今回の連載で解説した内容を元に、実際のCREATE DATABASE文のサンプルを提示します。
  • Windows系OSのOracle9iR2を前提にしています。パス名を直せばUNIX/Linux系OSのOracle9iR2でも利用できます。
  • 実際の環境で利用するためには、パラメータの詳細の値の見直し、本SQLを実行する前後の作業(環境変数の設定、catalog.sqlの実行等)が必要です。
  • 本スクリプトは筆者のPCで動作確認を取っています。ディスクの都合で全ファイルとも同じドライブに作成しています。
  • OMF(Oracle Managed Files)を利用しないケース、使用したケースの2種類を掲載しています。


OMFを利用しないケース


(1)初期化パラメータ(関連部分のみ)
  • db_name=case1
  • undo_management=AUTO
  • undo_tablespace=UNDOTBS1
  • control_files=("C:\oracle\oradata\case1\CONTROL01.CTL",
    "C:\oracle\oradata\case1\CONTROL02.CTL", "C:\oracle\oradata\case1\CONTROL03.CTL")
(2)CREATE DATABASE文
行番号
CREATE DATABASE文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE DATABASE case1
USER SYS IDENTIFIED BY TEST123
USER SYSTEM IDENTIFIED BY TEST456
MAXINSTANCES 1
MAXLOGFILES 10
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE 'C:\oracle\oradata\case1\system01.dbf' SIZE 250M REUSE
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE
'C:\oracle\oradata\case1\temp01.dbf' SIZE 40M REUSE
UNDO TABLESPACE UNDOTBS1 DATAFILE
'C:\oracle\oradata\case1\undotbs01.dbf' SIZE 200M REUSE
CHARACTER SET JA16SJISTILDE
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('C:\oracle\oradata\case1\redo01_1.log',
'C:\oracle\oradata\case1\redo01_2.log') SIZE 102400K,
GROUP 2 ('C:\oracle\oradata\case1\redo02_1.log',
'C:\oracle\oradata\case1\redo02_2.log') SIZE 102400K,
GROUP 3 ('C:\oracle\oradata\case1\redo03_1.log',
'C:\oracle\oradata\case1\redo03_2.log') SIZE 102400K;


(3)CREATE DATABASE文の解説
  • 2〜3行目
    ユーザーSYS及びSYSTEMにデフォルトでないパスワードを設定しています。セキュリティを高める観点で、デフォルトでないパスワードを設定することをお勧めいたします。
  • 8〜9行目
    システム表領域はローカル管理表領域として作成されます。
  • 10〜11行目
    デフォルトの一時表領域を設定しています。
  • 13行目
    DBのキャラクタ・セットとしてJA16SJISTILDEを指定しています。
  • 16〜21行目
    REDOログはグループを3つ、メンバーを2つ作成しています。


OMFを利用したケース

(1)初期化パラメータ(関連部分のみ)
  • db_name=case2
  • undo_management=AUTO
  • undo_tablespace=UNDOTBS1
  • db_create_file_dest=C:\oracle\oradata\case5
  • db_create_online_log_dest_1=C:\oracle\oradata\case5\log1
  • db_create_online_log_dest_2=C:\oracle\oradata\case5\log2
  • control_files→
    制御ファイルをOMF配下にする場合は設定しません。
    CREATE DATABASE実施時にSPFILEを使用する場合は、作成された制御ファイルが自動的に 本パラメータに登録されます。
    一方PFILEを使用する場合は、CREATE DATABASE実施後にPFILEに本パラメータを追加する必要があります。エントリに記述すべき制御ファイルの名称は、初期化パラメータDB_CREATE_ONLINE_LOG_DEST_n、あるいはDB_CREATE_FILE_DEST(DB_CREATE_ONLINE_LOG_DEST_nを指定していない場合)で指定したディレクトリに拡張子.ctlで作成されます。
(2)CREATE DATABASE文
行番号
CREATE DATABASE文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE DATABASE case2
USER SYS IDENTIFIED BY TEST123
USER SYSTEM IDENTIFIED BY TEST456
MAXINSTANCES 1
MAXLOGFILES 10
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE SIZE 250M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 40M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
UNDO TABLESPACE UNDOTBS1 DATAFILE SIZE 200M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
CHARACTER SET JA16SJIS
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 SIZE 102400K,
GROUP 2 SIZE 102400K,
GROUP 3 SIZE 102400K;


(3)CREATE DATABASE文の解説
  • 全般
    • OMFを利用しているのでファイル名を指定していません。
    • ファイル名以外のパラメータ(ファイルサイズ等)も指定を省けますが、本スクリプトでは値を設定しています。
    • 本スクリプトではデータファイルの自動拡張を指定しています。
  • 8〜13行目
    システム表領域・一時表領域・UNDO表領域のデータファイルは初期化パラメータDB_CREATE_FILE_DESTにて指定したディレクトリに作成されます。
  • 16〜18行目
    REDOログファイルは初期化パラメータDB_CREATE_ONLINE_LOG_DEST_1及びDB_CREATE_ONLINE_LOG_DEST_2にて指定したディレクトリにメンバーが分散されて作成されます。グループは各ディレクトリに3つずつ作成されます。

 第1部 DB全体の設計 第3部 テーブルの設計