Допустимые части таблицы разбросаны по всему .ibd
. файл. Операционная система не имеет возможности повторно использовать освобожденные части из середины таблицы.
Итак, InnoDB никогда не сжимает табличное пространство, а только увеличивает его.
Между тем, новый INSERTs
заполнит часть освободившегося места.
Что привело к такой ситуации? Вы DELETE
много строк? Если вы ожидаете сделать еще один большой DELETE
, см. Следующий совет в следующий раз: http://mysql.rjweb.org/doc.php/deletebig
Между тем, , если таблица была создана с innodb_file_per_table = 1
, затем OPTIMIZE TABLE
скопирует таблицу и передаст старую копию ОС. Но ... Вам нужно дополнительное дисковое пространство для выполнения этой задачи. И он заблокирует некоторые операции с таблицей. (Детали зависят от того, какую версию MySQL / MariaDB вы используете.)
Зачем вам нужно возмещать пространство? Если у вас не заканчивается место на диске, то какое это имеет значение?
Мало места?
Покажите нам SHOW CREATE TABLE
. Может быть несколько советов по уменьшению размера стола. (Это не решает проблему, но откладывает будущие проблемы.) Например, если INT
(4 байта) можно изменить на SMALLINT
(2 байта), это может помочь уменьшить таблицу. Или INDEX
может быть избыточным; DROPping
это бы помогло.
ALTER
, чтобы изменить такие вещи, может сделать OPTIMIZE
одновременно. (В MySQL 5.0 практически все ALTERs
выполняются путем копирования таблицы.)
Еще один совет, когда на диске ужасно мало места ... (Предполагая, что innodb_file_per_table всегда был включен): OPTIMIZE
столы меньшего размера; Некоторые из них могут немного сжаться, что даст вам дополнительное дисковое пространство.
Еще один совет:
- Определите, какие таблицы находятся в их собственных табличных пространствах.
- Узнать, сколько свободного места находится в
ibdata1
. SET innodb_file_per_table=OFF;
ALTER TABLE t ENGINE=InnoDB;
для некоторых небольших таблиц - это шаг 1. Но остановитесь, пока Data_free из ibdata1 не станет слишком маленьким.
Этот совет освободит место для той таблицы, которую можно было переместить, не вызывая роста ibdata1.