web-dev-qa-db-ja.com

一時テーブルのサイズを制限するにはどうすればよいですか?

データベースに大きな(InnoDB)テーブルがあります。どうやら、ユーザーはJOINを使用してSELECTを実行できるため、一時的な大きな(したがってディスク上の)テーブルが作成されます。場合によっては、それらが大きすぎてディスク領域を使い果たし、あらゆる種類の奇妙な問題が発生することがあります。

一時テーブルの最大サイズを制限する方法はありますかディスク上のテーブルの場合テーブルがディスクを大きくしすぎないようにしますか? tmp_table_size 名前に関係なく、メモリ内のテーブルにのみ適用されます。 ドキュメント に関連するものは何も見つかりませんでした。

そこに 議論でした オプションについてdisk-tmp-table-size、しかし コミット レビューを通過しなかったか、他の理由で失われたようです( 少なくともオプションは現在のコードベースに存在しません )。

(ストレージを増やす以外に)次善の策は、ディスク上の一時テーブルを作成しないようにMySQLを調整することだと思います。 DBAにはこれに関するヒントがいくつかあります 。十分なRAMがあり、ディスクストレージが不足している場合は、「オンディスク」一時テーブルを格納するためのRAMディスクを作成することもできます。

4
GhostGambler

MariaDBとMySQLにはこれに対するオプションはありません。数か月前にあなたと同じ問題に遭遇しました。たくさん検索し、NASに一時的なデータセット用の特別なストレージ領域を作成することで、最終的に部分的に解決しました。

NASまたは内蔵HDDにパーティションを作成します。定義上、サイズが制限されてからマウントし、mysql iniで、このドライブに一時ストレージを割り当てます。 (windows/linuxのいずれかを選択してください)

tmpdir="mnt/DBtmp/"
tmpdir="T:\"

この変更後、mysqlサービスを再起動する必要があります。

このアプローチでは、ドライブがいっぱいになった後でも、ディスク上のクエリで「奇妙な問題」が発生しますが、他の問題はなくなります。

2
Thomas G

MySQLの質問には答えませんが、MariaDBには tmp_disk_table_size があり、潜在的にも役立つ max_join_size 設定があります。しかしながら、 tmp_disk_table_sizeはMyISAMまたはAriaテーブル専用であり、InnoDB用ではありません。また、max_join_sizeは、実際の行数ではなく、結合の推定行数でのみ機能します。明るい面では、エラーはほぼ即座に発行されます。

1
user824276