Как ограничить размер временных таблиц?

У меня есть довольно большие (InnoDB) таблицы в базе данных; по-видимому, пользователи могут создавать SELECT с JOIN, что приводит к временным, большим (и, следовательно, на диске) таблицам. Иногда они настолько велики, что они исчерпывают дисковое пространство, что приводит к возникновению всех видов странных проблем.

Есть ли способ ограничить максимальный размер таблицы temp для таблицы на диске, чтобы таблица не перерастала диск? tmp_table_size применяется только к таблицам в памяти, несмотря на имя. Я не нашел ничего в документации .

Ответ 1

Там было обсуждение об опции disk-tmp-table-size, но она выглядит как фиксация не прошла проверку или не потерялась по какой-либо другой причине (по крайней мере, эта опция больше не существует в текущей базе кода).

Я думаю, что ваша следующая лучшая попытка (помимо увеличения объема хранилища) заключается в настройке MySQL, чтобы не создавать таблицы на диске на диске. В DBA есть несколько советов. Другая попытка могла заключаться в создании ramdisk для хранения временных таблиц "на диске" , если у вас достаточно ОЗУ и у вас недостаточно дискового хранилища.

Ответ 2

В MariaDB и MySQL нет возможности для этого. Я столкнулся с тем же вопросом, что и вы, несколько месяцев назад, я много искал, и я, наконец, частично решил его, создав специальную область хранения на NAS для временных наборов данных.

Создайте папку на вашем NAS или разделе на внутреннем жестком диске, она будет по определению ограничена по размеру, затем смонтирует ее, а в mysql ini назначит временное хранилище этому диску: (выберите либо windows/linux )

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

Служба mysql должна быть перезапущена после этого изменения.

При таком подходе, как только диск будет заполнен, у вас все еще есть "странные проблемы" с запросами на диске, но другие проблемы исчезли.

Ответ 3

Хотя это не отвечает на вопрос для MySQL, MariaDB имеет tmp_disk_table_size и потенциально также полезные настройки max_join_size. Однако tmp_disk_table_size предназначен только для таблиц MyISAM или Aria, но не для InnoDB. Кроме того, max_join_size работает только с предполагаемым количеством строк в соединении, а не с фактическим количеством строк. С другой стороны, ошибка выдается почти сразу.