データベースに大きな(InnoDB)テーブルがあります。どうやら、ユーザーはJOINを使用してSELECTを実行できるため、一時的な大きな(したがってディスク上の)テーブルが作成されます。場合によっては、それらが大きすぎてディスク領域を使い果たし、あらゆる種類の奇妙な問題が発生することがあります。
一時テーブルの最大サイズを制限する方法はありますかディスク上のテーブルの場合テーブルがディスクを大きくしすぎないようにしますか? tmp_table_size 名前に関係なく、メモリ内のテーブルにのみ適用されます。 ドキュメント に関連するものは何も見つかりませんでした。
そこに 議論でした オプションについてdisk-tmp-table-size
、しかし コミット レビューを通過しなかったか、他の理由で失われたようです( 少なくともオプションは現在のコードベースに存在しません )。
(ストレージを増やす以外に)次善の策は、ディスク上の一時テーブルを作成しないようにMySQLを調整することだと思います。 DBAにはこれに関するヒントがいくつかあります 。十分なRAMがあり、ディスクストレージが不足している場合は、「オンディスク」一時テーブルを格納するためのRAMディスクを作成することもできます。
MariaDBとMySQLにはこれに対するオプションはありません。数か月前にあなたと同じ問題に遭遇しました。たくさん検索し、NASに一時的なデータセット用の特別なストレージ領域を作成することで、最終的に部分的に解決しました。
NASまたは内蔵HDDにパーティションを作成します。定義上、サイズが制限されてからマウントし、mysql iniで、このドライブに一時ストレージを割り当てます。 (windows/linuxのいずれかを選択してください)
tmpdir="mnt/DBtmp/"
tmpdir="T:\"
この変更後、mysqlサービスを再起動する必要があります。
このアプローチでは、ドライブがいっぱいになった後でも、ディスク上のクエリで「奇妙な問題」が発生しますが、他の問題はなくなります。
MySQLの質問には答えませんが、MariaDBには tmp_disk_table_size があり、潜在的にも役立つ max_join_size 設定があります。しかしながら、 tmp_disk_table_size
はMyISAMまたはAriaテーブル専用であり、InnoDB用ではありません。また、max_join_size
は、実際の行数ではなく、結合の推定行数でのみ機能します。明るい面では、エラーはほぼ即座に発行されます。