MySQLは、POSIXシステムの一部であるトリックを永遠に使用します。一時ファイルを開き、すぐにリンクを解除します。したがって、どのディレクトリリストにも表示されません。ただし、UNIXやLinuxなどのPOSIXシステムは、プロセスが開いているファイルハンドルを持っている間は、リンクされていないファイルを実際に削除するべきではありません。したがって、一時テーブルを使用したクエリが終了すると、ファイルハンドルが閉じられ、OSが自動的にファイルを削除して、使用していたストレージを解放します。
これは通常、サーバーコードが終了したときに一時ファイルを削除することを忘れないようにするよりも優れています。また、スレッドが終了したり、mysqldがクラッシュしたりすることも説明します。少なくとも、古い一時ファイルがファイルシステムに散らかってしまうことはありません。
リンクされていないファイルのサイズは、lsof -s
で表示できます。 。そのコマンドの使用方法の例を調べるのはあなたに任せます(ここではGoogleがあなたの友達です)。
一時ファイルが167GBの空き容量を使い果たす可能性はほとんどありません。
または、一時ファイルが8GBしか使用していない可能性がありますが、20のスレッドが同時に同じクエリを実行している可能性があります。私はそれが一度起こるのを見ました。
ただし、値がtmp_table_size
である可能性が高いです。 これにより、一時テーブルのサイズが制限されます。
制限に達した場合は、必要に応じてセッション変数として、またはmy.cnf
でグローバルに、その構成オプションを上げることができます。 。
しかし、私は最初にクエリを最適化しようとします。なぜそのような大きな一時テーブルを作成する必要があるのですか?より少ない行を調べるように最適化できますか、それとも一時テーブルの作成を完全に回避できますか?