У меня есть одна таблица MySQL, использующая механизм хранения InnoDB; он содержит около 2 млн строк данных. Когда я удалил строки данных из таблицы, выделенное дисковое пространство не освободилось. Размер файла ibdata1 не уменьшился после выполнения optimize table
команды.
Есть ли способ вернуть дисковое пространство из MySQL?
Я в плохой ситуации; это приложение запущено примерно в 50 различных местах, и теперь проблема нехватки места на диске возникает почти во всех из них.
mysql
innodb
delete-row
Сумит Део
источник
источник
innodb_file_per_table
выключен. Хорошая новость в том, чтоon
в последних версиях MySQL эта опция включена по умолчанию.Ответы:
MySQL не уменьшает размер ibdata1. Когда-либо. Даже если вы используете,
optimize table
чтобы освободить пространство, используемое от удаленных записей, он будет повторно использовать его позже.Альтернативой является настройка сервера для использования
innodb_file_per_table
, но для этого потребуется резервное копирование, удаление базы данных и восстановление. Положительным моментом является то, что файл .ibd для таблицы уменьшается после расширенияoptimize table
.источник
ALTER TABLE t ENGINE=INNODB
на существующей таблице. " Это означает, что вы можете включить эту функцию, «преобразовать» существующие таблицы для использования отдельного файла InnoDB с помощью команды ALTER TABLE, а затем ОПТИМИЗИРОВАТЬ таблицу, чтобы уменьшить ее размер. Однако, как только вы закончите, вам нужно будет выяснить, как удалить (огромный) исходный файл InnoDB ...У меня была такая же проблема.
Что происходит, так это то, что даже если вы отбрасываете базу данных, innodb все равно не освобождает дисковое пространство. Мне пришлось экспортировать, остановить mysql, удалить файлы вручную, запустить mysql, создать базу данных и пользователей, а затем импортировать. Слава богу, у меня было только 200 МБ строк, но это сэкономило 250 ГБ файла innodb.
Неудача по замыслу.
источник
Если вы не используете innodb_file_per_table , освобождение дискового пространства возможно, но довольно утомительно и требует значительного времени простоя.
« Как сделать» довольно подробно, но я вставил соответствующую часть ниже.
Не забудьте также сохранить копию своей схемы в дампе.
источник
Десять лет спустя и у меня была такая же проблема. Я решил это следующим образом:
Это все :)
источник
Другой способ решить проблему освобождения пространства: создать несколько разделов в таблице - разделы на основе диапазона, разделы на основе значений и просто отбросить / усечь раздел, чтобы освободить пространство, что освободит пространство, используемое целыми данными, хранящимися в определенном разделе.
Когда вы введете разделение для своей таблицы, потребуются некоторые изменения в схеме таблицы, например - Уникальные ключи, индексы для включения столбца раздела и т. Д.
источник
Год назад я также столкнулся с той же проблемой в версии mysql5.7, а ibdata1 занимал 150 ГБ. поэтому я добавил табличные пространства отмены
Сделать резервную копию Mysqldump
Остановить службу mysql
Удалить все данные из каталога данных
Добавить ниже параметр отмены табличного пространства в текущем my.cnf
#undo tablespace innodb_undo_directory = /var/lib/mysql/ innodb_rollback_segments = 128 innodb_undo_tablespaces = 3 innodb_undo_logs = 128 innodb_max_undo_log_size=1G innodb_undo_log_truncate = ON
Запустить mysql service
store mysqldump backup
Проблема решена !!
источник
Есть несколько способов освободить дисковое пространство после удаления данных из таблицы для MySQL Inodb Engine.
Если вы не используете innodb_file_per_table с самого начала, выгрузка всех данных, удаление всех файлов, воссоздание базы данных и повторный импорт данных - единственный способ (проверьте ответы FlipMcF выше)
Если вы используете innodb_file_per_table, вы можете попробовать
источник