почему mysql не восстанавливает свободное место в файле ibd? - PullRequest
1 голос
/ 07 мая 2020

Я использую mysql5 и хочу уменьшить количество «удаленных» пробелов в файле ibd. Я уже ищу вариант «оптимизировать таблицу», но сейчас не могу его использовать, потому что это очень важная таблица. Он использует 19 ГБ в Mysql, но 33 ГБ в ОС. Я просто понял, что 33G становится все больше.

Я слышал, что он повторно используется в пространствах 33G, например, в черной области. Но почему он увеличивается каждый день?

MySQL не использует повторно эти свободные места? Я имею в виду, что около 24G никогда не используется повторно?

Спасибо за прочтение, надеюсь, мой бедный английский sh не сбивает вас с толку, когда вы его читаете.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Допустимые части таблицы разбросаны по всему .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 столы меньшего размера; Некоторые из них могут немного сжаться, что даст вам дополнительное дисковое пространство.

Еще один совет:

  1. Определите, какие таблицы находятся в их собственных табличных пространствах.
  2. Узнать, сколько свободного места находится в ibdata1.
  3. SET innodb_file_per_table=OFF;
  4. ALTER TABLE t ENGINE=InnoDB; для некоторых небольших таблиц - это шаг 1. Но остановитесь, пока Data_free из ibdata1 не станет слишком маленьким.

Этот совет освободит место для той таблицы, которую можно было переместить, не вызывая роста ibdata1.

0 голосов
/ 07 мая 2020

Вы ищете вариант innodb_use_trim=1 в сочетании с innodb_file_per_table=1, если версия MySQL, которую вы используете, достаточно новая, чтобы иметь ее. Это освободит пустые страницы, пробив дыры в файлах табличных пространств.

...