UNIX では、MySQL は一時ファイルを格納するディレクトリのパス名として、TMPDIR
環境変数の値を使用します。TMPDIR
が設定されていない場合、MySQL はシステムのデフォルトを使用します。通常、これは /tmp
、/var/tmp
、または /usr/tmp
です。
Windows では、MySQL は TMPDIR
、TEMP
、および TMP
環境変数の値を順番にチェックします。MySQL は最初に見つかった設定されている変数を使用し、残りの変数はチェックしません。TMPDIR
、TEMP
、および TMP
がいずれも設定されていない場合、MySQL は Windows システムのデフォルトを使用します。通常、これは C:\windows\temp\
です。
一時ファイルディレクトリが含まれているファイルシステムが小さすぎる場合は、mysqld に --tmpdir
オプションを使用して、十分な領域があるファイルシステムのディレクトリを指定できます。レプリケーションのスレーブでは、LOAD DATA INFILE
ステートメントをレプリケートするときに、--slave-load-tmpdir
を使用して一時ファイルを保持するための別個のディレクトリを指定できます。
--tmpdir
オプションには、ラウンドロビン方式で使用される複数のパスのリストを設定できます。パスは UNIX ではコロン文字 (「:
」)、Windows ではセミコロン文字 (「;
」) で区切るようにしてください。
負荷を効果的に分散するには、これらのパスに同じディスクの個別のパーティションではなく、個別の物理ディスクを指定してください。
MySQL サーバーがレプリケーションのスレーブとして動作する場合は、--slave-load-tmpdir
にメモリーベースのファイルシステム上にあるディレクトリ、またはサーバーのホストが再起動されたときにクリアーされるディレクトリを設定しないようにしてください。レプリケーションスレーブは、一部の一時ファイルがマシンの再起動後も存続し、一時テーブルまたは LOAD DATA INFILE
操作を複製できるようにする必要があります。サーバーが再起動されたときに、スレーブの一時ファイルディレクトリ内のファイルが失われると、レプリケーションは失敗します。
MySQL は、mysqld が終了したら一時ファイルが削除されるようにしています。これがサポートされるプラットフォームでは (UNIX など)、ファイルをオープンしたあとにリンク解除することによってこれが行われます。この方法のデメリットは、名前がディレクトリのリストに表示されないことであり、一時ファイルディレクトリがあるファイルシステムを満杯にしている大きい一時ファイルが表示されません。(そのような場合は、mysqld に関連付けられている大きいファイルを識別するために、lsof +L1 が役に立つことがあります。)
通常、MySQL はソート (ORDER BY
または GROUP BY
) を行うときに、1 つまたは 2 つの一時ファイルを使用します。必要となる最大のディスク領域は次の式によって判別されます。
(length of what is sorted + sizeof(row pointer))
* number of matched rows
* 2
行ポインタのサイズは通常 4 バイトですが、大きいテーブルの場合は将来拡張される可能性があります。
一部の SELECT
クエリーでは、MySQL は一時 SQL テーブルを作成します。これらは隠しテーブルではなく、SQL_*
という形式の名前が付けられます。
ほとんどの場合、ALTER TABLE
は元のテーブルの一時コピーを元のテーブルと同じディレクトリに作成します。ただし、ALTER TABLE
でインプレース手法 (オンライン DDL) が使用された場合、InnoDB
は一時ファイルを一時ファイルディレクトリに作成します。このディレクトリがそのようなファイルを保持するほどに十分に大きくない場合は、tmpdir
システム変数に別のディレクトリを設定する必要があることがあります。オンライン DDL については、セクション14.11「InnoDB とオンライン DDL」を参照してください。