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

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

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

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

5 ответов


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

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


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

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

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


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

на Как довольно глубоко , но я вставил соответствующую часть ниже.

Не забудьте также сохранить копию вашей схемы в дампе.

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

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

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

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

удалить все .файлы frm для таблиц InnoDB.

настройки нового табличная область.

перезапустить сервер.

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


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

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


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

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

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

  1. если вы можете удалить все данные, команда усечения удалит данные и освободит дисковое пространство для вы.
  2. команда Alter table отбросит и воссоздаст таблицу, чтобы она могла освободить дисковое пространство. Поэтому после удаления данных запустите alter table, которая ничего не меняет, чтобы освободить жесткий диск ( т. е.: таблица TBL_A имеет кодировку uf8, после удаления данных запустите ALTER TABLE tbl_a charset utf8 - > эта команда ничего не меняет из вашей таблицы, но она заставляет mysql воссоздать вашу таблицу и восстановить дисковое пространство
  3. создать TBL_B как TBL_A . Вставьте выбранные данные, которые вы хотите сохранить из TBL_A в TBL_B. Отбросьте TBL_A, и переименуйте TBL_B в TBL_A. Этот способ очень эффективен, если TBL_A и данные, которые необходимо удалить, большие (команда delete в MySQL innodb очень плохая производительность)