クラウドで 伸びる人沈む人 |
|
|
|
Oracleのデータファイル
<概要> Oracle(オラクル)のアーキテクチャのところで、データファイルは、データを格納するファイルそのものと書きました。 では、その格納してある場所はどこなのでしょうか? そのファイルは、どういう単位なのでしょうか? ここでは、そんなところを具体的にみていきますね。 では、いってみましょう。 <1.データファイルの場所> では、さっそくデータファイルって、どこに格納されているのでしょうか? 以下のSQLをたたいてみましょう。 SQL> select tablespace_name, file_name from dba_data_files ここで表示されたfile_name が全てのデータファイルです。 このファイルの中に、表のデータが入っています。 (まあ、ほかにもindex情報なども入ってますが、細かいことはおいといて、ひとくくりに表と言っておきましょう) <2.データファイルと表領域の関係> 上記のSQL> select tablespace_name, file_name from dba_data_files に出てくる、tablespace_name(表領域)についても説明します。ここを理解しないと、先に進まないです。 オラクルでは色々な表を扱いますが、 ひとつの表につき、ひとつのファイルを関連づけているわけではありません。 (CSVデータは、ひとつのファイルにつき、ひとつの表です) それは、オラクルのように大規模なDBを運営をする場合は、ひとつの表につき、 ひとつのファイルだと管理がとても煩雑になり、データベースのパフォーマンスが大きく劣化するからです。 そのかわり、複数の表をまとめた概念を表領域(テーブルスペース)と呼び、 この表領域が、そのままデータファイルと関連づけされるようになっています。 ちなみに、表領域は複数のデータファイルをもつことができます。 (って、だったら、表=ファイルじゃねえか?と思わないでくださいね) 下の図を見てください。例えば簡単にいうと、5つの表がありました。それが、ひとつの表領域になりました。 そのデータファイルは、2つでした。だから、5つの表は、2つのデータファイルに格納されている。 そんなかんじになります。 ※オラクル的にいうと、 5つのオブジェクトが、1つの表領域に登録されて、2つのデータファイルになっている。 <3.表(オブジェクト)と表領域の関係> 上で説明したように、表(オブジェクト)は、必ず表領域に関連づけられています。 あれ?でも、表を作成する時、表領域なんて全然意識してないぞ? そう思った方はいませんか。 そんなことはありません。表を作るときは、必ず、どこかの表領域に所属するようになっています。 ●構文をよく見てみましょう。 SQL> CREATE TABLE 表名 (列名 列のデータ型, [列名 列のデータ型]) [TABLESPACE 表領域名] [記憶領域パラメータ]; TABLESPACE (表領域)を指定することができるのです。このオプションを普段は意識していないだけです。 TABLESPACEを指定しないと、そのユーザーが所属する表領域(TABLESPACE)に表(オブジェクト) が作成されることになります。ちゃんとオブジェクトは、表領域に所属しているのです。 ※ ユーザーが所属する表領域は? ちなみに、ユーザーつくるときもデフォルトの表領域指定しますよ。 指定しないと、すべてSYSTEMという表領域に格納されてしまいます。 SYSTEMという表領域は、そのなのとおり表を運営していくためのシステムが格納されているので、 一般的には表領域を別途つくって、わけるのが普通です。 データファイルと表領域、表領域と表(オブジェクト)の関係、理解できましたでしょうか。 <4.おまけ:データファイル格納場所変更と容量> データファイルの格納場所は、特にデフォルトでも問題ないと思います。 一応、データファイル格納場所の変更方法です。 まずは、データベース停止してマウントで起動。 SQL> shutdown immediate SQL> startup mount 例えば、AAAという表領域に、ふたつのデータファイル(old1.dbfとold2.dbf)があって、 新しいデータファイル(new1.dbfとnew2.dbf)にしたい場合。 SQL> ALTER TABLESPACE AAA RENAME DATAFILE 'c:\oracle\db\old1.dbf', 'c:\oracle\db\old2.dbf' TO 'c:\oracle\db\new1.dbf', 'c:\oracle\db\new2.dbf'; 最後に、 SQL> alter database open で開けばOK。 ※ ちなみに、以下のSQLでデータファイルの大きさがわかります。 SQL> select * from sys.dba_data_files; SQL> select * from sys.dba_free_space; データファイルをあまりにも大きくとると、データが入っていなくてもディスクを圧迫するので気をつけてください。 |