Вы должны пойти с innodb_file_per_table, и вам нужно кое-что сделать, как очистить с текущей инфраструктурой InnoDB.
Я видел, как многие клиенты хостинга БД настраивали MySQL и оставляли InnoDB в состоянии по умолчанию. Это приводит к резкому росту системного табличного пространства (более известного как ibdata1).
Даже если вы переключитесь на innodb_file_per_table, файл .ibd придется извлечь из ibdata1, и ibdata никогда не будет уменьшаться. Например, если у вас есть таблица с именем mydb.mytable, которая находится внутри ibdata1, занимающая 2 ГБ, для ее извлечения необходимо выполнить следующее:
ШАГ 01) Добавьте это в /etc/my.cnf
[mysqld]
innodb_file_per_table
ШАГ 02) service mysql restart
ШАГ 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
Это сделает файл /var/lib/mysql/mydb/mytable.ibd
К сожалению, 2 ГБ пространства, которые были заняты таблицей до изменения, не могут быть возвращены. Я писал в прошлых сообщениях о том, как и зачем очищать инфраструктуру InnoDB:
После того как вы внесете это важное изменение, не забудьте увеличить innodb_open_files (по умолчанию 300) . В противном случае доступ к диску очень ограничен.
Что касается объединений, убедитесь, что у вас есть надлежащие индексы, которые поддерживают критерии объединения.
ОБНОВЛЕНИЕ 2012-04-02 11:30 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Использование innodb_file_per_table в новой установке приводит к очень медленному росту ibdata1, поскольку весь DDL выполняется вне ibdata. Вы можете уменьшить любую таблицу InnoDB, как я упоминал ранее, вот так:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ОБНОВЛЕНИЕ 2012-04-02 16:50 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Когда дело доходит до резервного копирования, будьте предельно осторожны при копировании файлов .ibd. Почему?
Внутри каждого файла .ibd есть специальное значение, известное как tablespace_id. В ibdata1 есть список значений tablespace_id. Если вы когда-либо выполняете обслуживание таблицы, которое требует удаления и повторного создания таблицы, tablespace_id станет другим. Создание копии такого файла .ibd может быть добавлено обратно в базу данных только для использования, если вы также сделаете копию ibdata1. Это ставит под угрозу tablespace_id всех других таблиц InnoDB. В свете этого, желательно, чтобы вы выполняли резервные копии mysqldump, потому что mysqldumps являются логическими копиями данных. Другими словами, резервное копирование не зависит от момента времени ibdata1, и вы можете перезагрузить его без проблем с работоспособностью.
Согласитесь с @RolandoMySQLDBA за то, что он не упоминает: резервные копии.
Если у вас полностью отработан режим резервного копирования MySQL, и вы не включаете его файл .ibd в свою стратегию резервного копирования файловой системы, то это не так важно. Но учтите, что добавление ОДНЫХ БАЙТОВ в любую таблицу innodb приведет к инкрементному резервному копированию вашей таблицы .ibd, и вы увидите, что у вас быстро закончится резервное хранилище.
источник
У меня есть приложение, где у меня именно такая ситуация: несколько больших таблиц и несколько меньших.
Я решил оставить маленькие в то
ibdata1
время как помещать большие в свои файлы.Я делаю это, будучи
innodb_file_per_table
включенным по умолчанию , и только отключить его временно для перемещения таблицыibdata1
сALTER TABLE
.источник
ALTER TABLE
их. Поэтому моя стратегия состоит в том, чтобыinnodb_file_per_table
регулярно включать и отключать его, чтобы переместить небольшой стол вibdata1
и затем снова включить его.