Перенос существующих таблиц Mysql в отдельные файлы (innodb_file_per_table)
Задача
Есть Mysql сервер, в котором все базы хранятся в одном innodb файле (ibdata1), необходимо перевести сервер на опцию innodb_file_per_table, вынести все существующие таблицы в отдельные файлы, и уменьшить размер ibdata1.
Решение
Отключаем сетевой доступ к Mysql (добавить skip-networking
в /etc/my.cnf) и останавливаем все локальные сервисы, которые ее используют.
Делаем дамп БД:
mysqldump --all-databases > all-databases.sql
Дропаем все базы кроме mysql
и information_schema
echo "show databases" | mysql echo "drop database <db_name>" | mysql ... echo "drop database <db_name>" | mysql
Останавливаем mysql
Добавляем опцию innodb_file_per_table
в /etc/my.cnf
service mysqld stop
Удаляем файлы с данными и лог
rm -f /var/lib/mysql/ibdata1 rm -f /var/lib/mysql/ib_logfile0 rm -f /var/lib/mysql/ib_logfile1
Запускаем mysql
service mysqld start
Заливаем базы обратно
cat ./all-databases.sql | mysql
Открываем сетевой доступ к Mysql и страртуем локальные сервисы.
Готово!