ibdata1 хранит данные таблиц (кроме схем — они хранятся в других файлах), индексы и некоторую другую информацию. Этот файл нельзя просто удалить, так как это приведет к уничтожению данных таблиц. Кроме того файл ibdata1
фактически не может быть сокращен в размере, если только вы не удалите все базы данных, не удалите файлы и не перезагрузите дамп.
С целью оптимизации потребления дискового пространства файлом ibdata1 я предлагаю комплексный подход: настроить MySQL на использование отдельных файлов для каждой таблицы и затем освобождение дискового пространства, занятого файлом ibdata1 :
Чтобы настроить сервер для использования отдельных файлов для каждой таблицы, в my.cnf
добавьте следующую директиву:
1 2 3 |
[mysqld] innodb_file_per_table=1 |
Далее освобождаем пространство, занятое файлом ibdata1:
- Сделайте
mysqldump
всех баз данных, процедур, триггеров и т.д.:
1mysqldump --all-databases > alldb.sql - Удалите все базы данных , кроме
mysql
иperformance_schema
:
1> drop database db1; - Остановите mysql:
1sudo service mysqld stop - Удалите
ibdata1
иib_log
файлы:
12sudo rm /var/lib/mysql/ibdata1sudo rm /var/lib/mysql/ib_logfile
(и удалите любой другой ib_logfile, который может быть назван ib_logfile0, ib_logfile1 и т.д.) - Запустите mysql:
1 |
sudo service mysqld start |
- Восстановите базы данных из дампа:
1mysql -u root -p < alldatabases.sql
Команда выше сработает если alldatabases.sql
содержит CREATE DATABASE
директивы, иначе вам необходимо будет сначала создать пустые базы данных командами create database [database_name]
и лишь затем выполнить последний шаг.
После запуска MySQL файлы ibdata1
и ib_log
будут воссозданы. Но теперь когда вы создаете новую базу данных, таблицы будут находиться в отдельных файлах ibd*, а не в ibdata1. Как правило, если вы удаляете базу данных, файлы ibd* также будут удалены.
Используя команду ALTER TABLE ENGINE=innodb
или OPTIMIZE TABLE
, вы можете извлекать данные и индексировать страницы из ibdata1 для разделения файлов. Однако ibdata1 не будет сокращаться в размере, если вы не выполните указанные выше шаги.