MySQL InnoDB не освобождает дисковое пространство после удаления строк данных из таблицы

У меня есть одна таблица MySQL, использующая механизм хранения InnoDB; он содержит около 2M строк данных. Когда я удалял строки данных из таблицы, он не освобождал выделенное дисковое пространство. Кроме того, размер файла ibdata1 не уменьшился после запуска команды optimize table.

Есть ли способ вернуть дисковое пространство из MySQL?

Я в плохой ситуации; это приложение работает примерно в 50 разных местах, и теперь проблема с низким дисковым пространством появляется почти у всех из них.

Ответ 1

MySQL не уменьшает размер ibdata1. Когда-либо. Даже если вы используете optimize table для освобождения пространства, используемого в удаленных записях, он будет использовать его позже.

Альтернативой является настройка сервера на использование innodb_file_per_table, но для этого потребуется резервное копирование, удаление базы данных и восстановление. Положительная сторона состоит в том, что файл .ibd для таблицы уменьшается после optimize table.

Ответ 2

У меня была такая же проблема.

Случается, что даже если вы удалите базу данных, innodb все равно не освободит место на диске. Мне пришлось экспортировать, останавливать mysql, удалять файлы вручную, запускать mysql, создавать базу данных и пользователей, а затем импортировать. Слава богу, у меня было только 200 МБ строк, но он спас 250 ГБ файла innodb.

Сбой по дизайну.

Ответ 3

Если вы не используете innodb_file_per_table, исправление дискового пространства возможно, но довольно утомительно и требует значительного количества времени простоя.

How To довольно подробно, но я вставил соответствующую часть ниже.

Обязательно сохраните копию вашей схемы в своем дампе.

В настоящее время вы не можете удалить файл данных из системного табличного пространства. Чтобы уменьшить размер табличного пространства системы, используйте следующую процедуру:

Используйте mysqldump для сброса всех ваших таблиц InnoDB.

Остановить сервер.

Удалите все существующие файлы табличного пространства, включая ibdata и Файлы ib_log. Если вы хотите сохранить резервную копию информации, затем скопируйте все файлы ib * в другое место перед удалением файлы в вашей установке MySQL.

Удалите любые файлы .frm для таблиц InnoDB.

Настроить новое табличное пространство.

Перезагрузите сервер.

Импортировать файлы дампа.

Ответ 4

Другим способом решения проблемы исправления пространства является создание нескольких разделов в разделах на основе основанных на основе, основанных на значениях, и просто удаление/усечение раздела для восстановления пространства, которое освободит пространство, используемое целыми данными, хранящимися в конкретный раздел.

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

Ответ 5

Десять лет спустя и у меня возникла такая же проблема. Я решил это следующим образом:

  • Я оптимизировал все оставшиеся базы данных.
  • Я перезапустил мой компьютер и MySQL на сервисах (Windows + r → services.msc)

Вот и все :)

Ответ 6

Существует несколько способов вернуть дисковое пространство после удаления данных из таблицы для MySQL Inodb engine

Если вы не используете innodb_file_per_table с самого начала, сбрасывая все данные, удаляйте весь файл, повторно создавайте базу данных и импортируйте данные снова, это только способ (проверьте ответы FlipMcF выше)

Если вы используете innodb_file_per_table, вы можете попробовать

  • Если вы можете удалить все данные, команда truncate удалит данные и освободит дисковое пространство для вас.
  • Команда Alter table отбрасывает и воссоздает таблицу, чтобы она могла вернуть дисковое пространство. Поэтому после удаления данных запустите таблицу изменений, которая ничего не меняет для выпуска жесткого диска (т.е. Таблица TBL_A имеет charset uf8, после удаления данных запуска ALTER TABLE TBL_A charset utf8 → эта команда ничего не меняет из вашей таблицы, но делает mysql воссозданием вашей таблицы и восстанавливает дисковое пространство
  • Создайте TBL_B, как TBL_A. Вставьте выбранные данные, которые вы хотите сохранить от TBL_A, в TBL_B. Снимите TBL_A и переименуйте TBL_B в TBL_A. Этот способ очень эффективен, если TBL_A и данные, которые необходимо удалить, являются большими (команда delete в MySQL innodb - очень плохая производительность).