2012年11月10日土曜日

テーブルスペースとログファイルについて(ibdata*、ib_logfile*)

いつもmysqlの中身を見た時に巨大化しているファイルを良く見かけていましたが、
( ´_ゝ`)フーンっていうぐらいにしか思っていなかったので
ibdata*とib_logfile*について調べてみました(ΦωΦ)フフフ…

簡単な説明をすると、
ibdata*は共有テーブルスペース(全データを管理します。)
ib_logfile*は、ログファイルらしいです。

データは直接テーブルスペースに更新がされるのではなく、
一旦ログファイルに更新内容が書き込まれる。
その後に、テーブルスペースに反映される流れになっているらしい。
テーブルスペースの更新はコストが高いのですぐに反映するのではなく、
ログファイルに書いておくことで、書き込みの性能をあげてるらしい(´・∀・`)ヘー

そのため、InnoDBのデータは、テーブルスペースとログを合わせて完全な情報となるらしい。

↓実際のファイルはこいつらですド━━━━m9(゚∀゚)━━━━ン!!
# ls -alt /var/lib/mysql
合計 14871500
-rw-rw----  1 mysql mysql    5242880 11月  5 01:49 2012 ib_logfile0
-rw-rw----  1 mysql mysql    5242880 11月  5 01:49 2012 ib_logfile1
-rw-rw----  1 mysql mysql 9590276096 11月  5 01:49 2012 ibdata1
それでは、まずはibdataの詳細について!(`・ω・´)シャキーン

ibdataはデフォルトの設定では、全データを1つのファイルで管理している?ので、
運用を続けていくうちにどんどん肥大化していきます。

その原因として、デフォルトの設定のibdataファイルの自動拡張設定があります。
自動拡張の設定は、innodb_data_file_pathでautoextendが記述されていると拡張されてしまう。
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
この設定があると、最大値が無いためHDD100%まで肥大化してします・・・:(;゙゚'ω゚'):

また一度大きくなったibdataのテーブルスペースを小さくする手段としては、
ダンプ後にibdata*のファイルを削除後にリストアするしか方法がないとのことですガ━━(;゜Д゜)━━ン!!

自動拡張が原因なので、自動拡張の上限をつければ良いかと思いきや、
今度は上限に達した場合に、テーブルへの更新が出来なくなるという現象になるらしい・・・orz
HDDの100%になっても出来ませんけどね・・・その際にはMySQLにすらログインできなくなる(´;ω;`)ウッ…

自動拡張無しの設定
[mysqld]
innodb_data_file_path=ibdata1:300G
自動拡張を無くした状態で、テーブルスペースを大きくしたい場合には、
[mysqld]
innodb_data_file_path=ibdata1:300G;/data2/ibdata2:700G
のように記述していかなければいけない。
(ibdata1とibdata2というファイルが作られる?)

そこで、この問題を回避するための手段として、innodb_file_per_tableを設定する方法がある(゚∀゚)キタコレ!!
ただし注意点として次のようなことがあるそうです。
こちらのサイトから引用です
innodb_file_per_tableの設定をしておくと、テーブルごとにテーブルスペースが作成される
拡張子は.ibdである。.ibdファイルは要求に応じて自動拡張するのだが、テーブルを削除すると対応する.ibdファイルも削除されるのである。
つまり、一度テーブルスペースが大きくなってしまってからでもテーブルを削除すればファイルシステムの空き領域を増やすことが可能になるのである。
これは運用上とてもメリットがあるだろう。
テーブルごとにテーブルスペースを作成する場合でも、共有テーブルスペース(ibdata1)が必要になる点に注意しよう。
ここには、各テーブルのディクショナリ情報や ロールバックセグメントなどが格納される。一度に大量のアップデートを行った場合などには大きなロールバックセグメントが必要になる。
その際に共有テーブルスペースが自動拡張しないよう、サイズを決めうちにしておくといいだろう。

ただし、この運用で気をつけないといけないのは共有テーブルスペースを削除してはならない!!ということである。
確かに共有テーブルスペースにテーブルのデータは入っていないが、各.ibdのメタデータを格納しているので、
共有テーブルスペースがないとInnoDBが.ibdファイルを見つけられないのである。
また、他のサーバへ単体の.ibdファイルだけを持っていっても使えない。(無理矢理使う方法はあるけど一般的にはオススメしない。)
つまり、.ibdファイルと共有テーブルスペースはセットなのである。

innodb_file_per_tableを設定しても、ibdataは消しちゃダメ!絶対!ァカンァカン(´゚д゚`)ノ゙ノ゙ってことですね!
あとは、innodb_data_home_dirを明示的に指定する場合には、
innodb_file_per_tableオプションは利用してはいけないらしい。

■データファイルの初期化について
利用するディスク容量が決まっている場合には、最初にデータファイルを初期化しておくと良い。
データファイルは自動拡張しますが、拡張するタイミングでI/Oが発生するため、
最初に領域を確保し自動拡張しないように設定した方が高速になる。
#2TB用の設定
innodb_data_file_path=ibdata1:2000G
データファイルのサイズが大きい場合には初期化の時間にかかってしまうので、
セットアップを早く終わらせた場合には、次のように記述する。
#自動拡張を有効にして、最大値が500G、拡張子時に確保するサイズは64MBになる。
innodb_data_file_path=ibdata1:1G:autoextend:max:500G
innodb_autoextend_increment=64
maxを設定しない場合には、肥大化に気をつけてHDDのサイズを超えないようにする。

実際のテーブルスペースの肥大化の対象方法いついてはこちらの記事に書いてあります(`・ω・´)ゞビシッ!!


参考URL

0 件のコメント:

コメントを投稿