MySQLのテンポラリファイル

3月 28, 2009

(一部削除及び追記しました。2010/03/04)

いきなりではあるが、MySQLのテンポラリファイルについて。
MySQLはSQL文を発行する際に、指定のtemp領域上でテンポラリファイルを作成し、
それを削除し、また作成し…と、こんなことを繰り返して処理を行っているのだそうだ。

この時に重いトランザクション処理が行われると、巨大なテンポラリファイルが作成され、
ディスク領域を圧迫することがある。

もしディスク領域が圧迫されつづけ、フルになったらどうなるか。
オフィシャルサイトのページからの抜粋なのだが、以下のような動作になるとのこと。

1分ごとに 1 回、現在のレコードを書き込むために十分な空き領域があるかどうか
確認する。十分な空き領域がある場合は、何も問題が発生しなかったように処理を
続行する。

6分ごとにログファイルにエントリを書き込み、ディスクフル状態を警告する。


これ以降、問題を軽減するための対処も書かれているのだが、正直、自分は読んでも
よくわかりません。
「上記の操作を実行中に MySQLがディスクフル状態になると、大きなテンポラリファイル
が削除され、テーブルはクラッシュしたものとしてマークされます」
って、テーブルがクラッシュしたものとしてマークされるとどうなるんだろう???

自分はMySQL初心者かつ勉強不足なので、理解できないのが情けなくもあるのだが、
とにかくまず最初にやるべきことは「ディスク上に十分なtemp領域を確保した設計に
すること」が言えるのではないかと。

ちなみにこのテンポラリファイルは隠しファイルで、しかも処理が終われば消えてしまうそうだ。
事後調査でディスク領域を圧迫するSQL文を特定するのが不可能になってしまう、ってワケだ。

追記
テンポラリファイルの格納ディレクトリは、特に指定しなかった場合OS上のデフォルトが使用される
(/tmp もしくは /usr/tmp)。
特定の場所を指定するにはmy.cnfのtmpdirパラメータに記述する。

テンポラリファイルが生成される際のサイズは、MySQLサーバ上で取り扱うデータサイズやSQL文
による。これといった指針はMySQLリファレンスマニュアルにも書かれていないようである。


Categories: MySQL