データファイルを作成する際は、実際の運用に配慮する必要がある。これから解説する注意点に留意することで、運用時のトラブルを回避することも可能になる。
前回は、Oracleシステムを支える基本かつ非常に大事なファイルであるパラメータ/コントロール/REDOログファイルについて説明しました。それぞれOracleを管理するうえで欠かすことのできないシステムファイルです。
今回は、データベースユーザーにとっては一番身近で重要な領域、実際にユーザーのデータが格納されるデータファイルについて説明しましょう。
データファイルは、実際にユーザーのデータが格納される場所です。Oracleの内部では論理的に「テーブルスペース(表領域)」を作成し、その中にテーブルなどを格納することになります。
右の図にあるように、テーブルスペースはOracle内部に「論理的に」作られるため、複数のデータファイルから構成させることが可能です。例えばOS/ファイルシステムの制限でファイルサイズに制限がある場合(Linuxのカーネル2.2以前では2Gbytes)でも、複数のデータファイルを集めて1つの大きなテーブルスペースを作ることができます。
また、複数のデータファイルを複数の物理ディスクに配置することにより、ディスクI/O負荷を分散させることもできます。経験的に、これはパフォーマンス向上に非常に効果的です。また、テーブルスペースの使用状況により、後からデータファイルを追加してテーブルスペースのサイズを拡張することもできます。
テーブルスペースにはユーザーのテーブルやインデックスだけでなく、システム領域(ユーザーログイン名やたくさんのシステム情報を格納)や、ロールバックセグメントなども格納されます。これらは、1つのテーブルスペースにすべて格納することもできるのですが、実際のデータベース運用を任されたOracleマイスターがそれで満足していてはいけません。運用管理のことを考慮した場合、少なくとも以下の4つのテーブルスペースに分割して作成する必要があります。
では、実際にデータファイルを作成してみましょう。実際には、テーブルスペースを作成するSQL文のパラメータとしてデータファイル名とその大きさを指定します。
サーバマネージャ(svrmgrl)でconnectするか、sqlplusでシステム権限(実際にはcreate tablespace権限)を持っているユーザー(通常はsys)でOracleにログインし、以下のcreate
tablespace文を実行します。
CREATE TABLESPACE USER1 DATAFILE '/oracle/SFO/user1_1.dbf' SIZE 100M ,'/oracle/SFO/user1_2.dbf' SIZE 100M;
このSQL文はデータファイルuser1_1.dbfとuser1_2.dbfを作成し、それらからUSER1というテーブルスペースを作成しています。
実際の実行結果は以下のようになります。
$ sqlplus sys /*********SQL*Plus: Release 8.0.5.0.0 - Production on Wed Jan 31 22:51:9 2001 (c) Copyright 1998 Oracle Corporation. All rights reserved. Connected to: Oracle8 Release 8.0.5.0.0 - Production PL/SQL Release 8.0.5.0.0 - Production SQL> CREATE TABLESPACE USER1 DATAFILE SQL> '/oracle/SFO/user1_1.dbf' SIZE 100M SQL> ,'/oracle/SFO/user1_2.dbf' SIZE 100M; Tablespace created. SQL>
このように、「Tablespace created.」と表示されれば成功です。
上記のcreate tablespace文は最低限のオプションしか付けていません。Oracleマイスターとしては、もう少し細かい設定をするためにオプションを追加しましょう。
CREATE TABLESPACE USER1 DATAFILE '/oracle/SFO/user1_1.dbf' SIZE 100M AUTOEXTEND OFF ,'/oracle/SFO/user1_2.dbf' SIZE 100M AUTOEXTEND OFF MINIMUM EXTENT 1M DEFAULT STORAGE ( INITIAL 1M NEXT 1M MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0) ;
新たに追加したオプションの意味を以下に示します。
AUTOEXTEND OFF
データファイルの自動拡張を禁止します。
MINIMUM EXTENTS
テーブルスペースの最小「エクステント」(後述)のサイズを指定します。
DEFAULT STORAGE
このテーブルスペースに作られるテーブル標準のSTORAGE句を設定します。テーブル作成時にSTORAGEの指定を省略した場合、このテーブルスペースの標準値が使用されます。STORAGE句とは、テーブルの最初の大きさや拡張される場合の大きさを定義するものです。
STORAGE句の主なオプション
INITIAL
テーブル作成時のデフォルトサイズを指定します。
NEXT
テーブルのデータが多くなってきたときに、テーブルの領域を拡張する大きさを指定します。
MINEXTENTS
「エクステント」の最小数を指定します。
MAXEXTENTS
「エクステント」の最大数を指定します。
PCTINCREASE
次の「エクステント」の増加分をパーセントで指定します。よほどの理由がない限り、ここは「0」にすることをお勧めします。
上記のINITIAL/NEXTで指定される領域の塊を「エクステント」と呼びます。つまり、通常は作成直後のテーブルは1つのエクステントからなっていますが、データの増加によって自動拡張される際にエクステントが自動的に追加されていくわけです。上記の例では、1テーブル当たり4096個まで自動的に追加されることになります。
MINEXTENTSとDEFAULT STORAGEオプションは必ず指定するようにしましょう。というのも、運用を続けていくとどうしてもテーブルスペースは「断片化」して使用効率が悪くなっていきます。テーブルの拡大・縮小が繰り返されると使われなくなった「エクステント」が発生するのですが、その大きさがバラバラだと再利用されにくくなってしまうからです。
データファイルのオプションであるAUTOEXTENDはオフにすることをお勧めします。というのも、データファイルを自動拡張可能にしても、もともとのディスクの大きさ以上にはできないわけですし、それ以前にOracleマイスターとしてはしっかりテーブルスペースのサイズと残り容量を把握しながら運用しなくてはならないからです。
テーブルスペースの残りが足りなくなってきたら、改めてALTER TABLESPACE文を使ってデータファイルを追加します。
SQL> ALTER TABLESPACE USER1 ADD DATAFILE SQL>'/oracle/SFO/user1_3.dbf' size 50M;Tablespace altered.
実際に運用されているデータベースでよくある問題は、テーブルスペースの領域に関するものでしょう。データは、どんなシステムでも常に増えていくといっても過言ではありません。残り領域が少なくなると、新しいテーブルが作れなくなったりEXTENDエラー(テーブルが拡張できない)が発生したりします。OSの管理の第1歩がディスク(ボリューム)の管理であるのと同様、Oracleマイスターとしてはテーブルスペースの残り領域をしっかり管理しましょう。最初に見積もったテーブルサイズのまま一切拡張しない(必要ない)のが一番理想的なのですが、実際の運用ではテーブルの拡張は致し方ないところだと思います。
作成したテーブルスペースやデータファイルの大きさ、そして残り容量は以下のSQL文を実行することにより把握できます。
SQL> select * from sys.dba_data_files; SQL> select * from sys.dba_free_space; SQL> select * from sys.dba_free_space_coalesced;
これらのdbaで始まる名前のテーブル(ビュー)は「データディクショナリ」と呼ばれ、データベース内の重要な情報を見ることができるようになっています。これらの詳細についてはここでは特に説明しませんが、ぜひ一度上記のSQL文を実行してみてください。
Copyright © ITmedia, Inc. All Rights Reserved.