InnoDBデータファイルの仕様

1月 26, 2010

InnoDBデータファイルの仕様について、覚え書き。
MySQLデータディレクトリ配下に生成される、ibdata1、ibdata2…といったファイル名
のデータファイルが、InnoDBデータファイルである。このInnoDBデータファイルに
格納されるものは、というと。

・InnoDBテーブル
・インデックスデータ
・データディクショナリ(テーブルのレコード数などの統計情報)
・トランザクションのロールバックのためのデータ領域
(ロールバックセグメント)


・・・といったところである。
InnoDBデータファイルは複数作成することが可能で、それらをまとめて「システム表領域」と呼ぶ。
ちなみに「Oracleで言えば、SYSTEM表領域だけでデータベースを構築するようなイメージである」
ということだそうだ。、、、と聞いても、自分はよく分からないが(汗)

データベース領域上には、ただ1つのシステム表領域が存在する。
注:この場合の「データベース領域」というのはインスタンスに対して
1対1で対応する
物理領域全体のことで、「データベース」そのものを指しているのではない。

ここで注意したいのが、

「InnoDBデータファイルは、InnoDBテーブルやデータベースとの直接の対応関係はない」

ということ。
分かりにくいので、ポイントをまとめてみよう。

・全てのInnoDBデータファイルを集めたものが「システム表領域」である。
・システム表領域内にInnoDBテーブルが格納される。
・1つのInnoDBデータファイル内に複数のInnoDBテーブルが格納されることがある。
・複数のInnoDBデータファイル内に1つのInnoDBテーブルがまたがって格納されることもある。
・InnoDBテーブルが扱えるサイズはInnoDBデータファイルすべての合計である。
・OSのファイルシステムによってファイルひとつあたりのサイズの上限があるが、InnoDBテーブルはその制約を受けずに済む。InnoDBテーブルのサイズは、個々のInnoDBデータファイルのサイズに制限されない。
・名InnoDBデータファイルは、異なるディレクトリに分散して配置させることも可能。


図にしてみるとシステム表領域とInnoDBデータファイル、InnoDBテーブルの関係は以下のようになる。

system_table.jpg

my.cnfでの設定について。データファイルの配置は、以下のパラメータで指定する。

innodb_data_home_dir = ディレクトリを指定
innodb_data_file_path = ファイル名とファイルサイズ及び
データファイル自動拡張とその最大サイズを指定


以下例においては、ibdata2はシステム表領域が不足した再に2000MBまで自動拡張するように指定している。

innodb_data_file_path = ibdata1:100M;ibdata2:200M:autoextend:max:2000M


ちなみにdata_file_pathで複数の配置場所を指定した場合は、data_home_dirの値は空文学とする。
初期状態では、上記パラメータで指定したサイズの分だけディスク領域が確保される。
InnoDBテーブルを1つも作成していなくても、だ。
また自動拡張機能を有効にしている場合、InnoDBデータファイルは一度拡張すると、
テーブルを削除してもサイズは縮小しない。
自動拡張は便利そうだがこのようにやっかいな面もあり、拡大しすぎたテーブルスペースが
ファイルシステムを圧迫しかねない。
これらが問題になる場合は「複数表領域オプション」を利用するといいらしい。

複数表領域について
この機能は、InnoDBテーブルやインデックスデータを、システム表領域内ではなく、
別ファイルとして分離するものとなる。このオプションを利用した場合、システム表領域内には
テーブル/インデックスデータは格納されず、データディクショナリなどが格納される
(要するに後述する「.ibd」のメタ情報ってことみたいだ)。

ではテーブルデータはどこへいくのかというと、、、
1つのInnoDBテーブルを作成するごとに「テーブル名.ibd」という名前で1つのファイルが作成され、
ここへテーブル/インデックスデータが格納される仕様、なんだそうだ。
MyISAMでテーブルを作成した時にできる「テーブル名.MYD」みたいなもの???
うっすら掴めてきたような。。再びポイントをまとめてみよう。

・複数表領域オプションを使用した場合、InnoDBデータファイル(ibdata1)
にテーブルは格納されない。
・ひとつのibdファイルはひとつのInnoDBテーブルに対応する。
・ひとつのibdファイルがひとつの表領域と呼ばれる。
・InnoDBテーブルを複数作成すれば複数のibdファイルが作成されるため、複数表領域と呼ばれる。
・ibdの作成場所は、データディレクトリ配下。
・テーブルを削除すれば、そのibdファイルも削除される。このためデータファイルの肥大化を防ぐことができる。
・ただし、ibdファイルはMYDファイル同様、ファイル1つあたりのサイズ制限の制約を受ける。
(要するにOSのファイルシステムによる制限?)

・複数表領域を利用する場合でも、innodb_data_file_pathの指定は必要である。
※複数表領域を使用しても、ロールバックセグメントなどInnoDB共通の領域には
システム表領域が使われ、InnoDBデータファイルが不要になるわけではないため。


最後に、複数表領域オプションを利用したい場合はmy.cnfで以下のように設定する。

innodb_file_per_table


やっと概要がつかめてきた、、、かもしれない。
これより深い領域については、また別途調べることにしようw

出典
「現場で使えるMySQL」松信嘉範著


Categories: MySQL