У меня есть полный ответ на этот.
Как только innodb_file_per_table будет введен в действие, и новые таблицы InnoDB могут быть сокращены, используя ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Это уменьшит новые .ibd
файлы, ГАРАНТИРУЕМЫЕ.
Если вы запустите ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
таблицу InnoDB, созданную до того, как вы использовали innodb_file_per_table, она извлечет данные и индексы для этой таблицы из файла ibdata1 и сохранит их в .ibd
файле. Это оставит в ibdata1 постоянное целое голубя, которое никогда не будет использовано повторно. ,
ibdata1
Файл обычно находится четыре типа информации
Вот гарантированный способ сжать файл ibdata1 почти навсегда ...
ШАГ 01) MySQLDump все базы данных в текстовый файл SQL (назовите его SQLData.sql)
ШАГ 02) Удалите все базы данных (кроме схем mysql, information_schema и performance_schema)
ШАГ 03) Отключение mysql
ШАГ 04) Добавьте следующие строки в /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Примечание. Независимо от того, какой у вас набор для innodb_buffer_pool_size, убедитесь, что innodb_log_file_size составляет 25% от innodb_buffer_pool_size.
- ШАГ 05) Удалите ibdata1, ib_logfile0 и ib_logfile1 ( см. Обновление ниже перед удалением! )
На этом этапе должна быть только схема mysql в / var / lib / mysql
- ШАГ 06) Перезапустите MySQL
Это восстановит ibdata1 на 10 МБ (не настраивать опцию), ib_logfile0 и ib_logfile1 на 1G каждый
- ШАГ 07) Перезагрузите SQLData.sql в mysql
ibdata1
будет расти, но будет содержать только метаданные таблицы и прерывистые данные MVCC.
Каждая таблица InnoDB будет существовать вне ibdata1
Предположим, у вас есть таблица InnoDB с именем mydb.mytable. Если вы войдете в /var/lib/mysql/mydb
, вы увидите два файла, представляющих таблицу
mytable.frm
(Заголовок механизма хранения)
mytable.ibd
(Главная таблицы данных и табличных индексов для mydb.mytable
)
ibdata1
никогда не будет содержать данные InnoDB и индексы.
С опцией innodb_file_per_table/etc/my.cnf
вы можете запустить OPTIMIZE TABLE mydb.mytable
ИЛИ, ALTER TABLE mydb.mytable ENGINE=InnoDB;
и файл /var/lib/mysql/mydb/mytable.ibd
будет фактически уменьшен.
Я делал это много раз за свою карьеру в качестве администратора баз данных MySQL, не испытывая при этом ни единой проблемы. Фактически, в первый раз, когда я сделал это, я свернул файл ibdata1 размером 50 ГБ в 50 МБ.
Попробуйте. Если у вас есть дополнительные вопросы по этому поводу, напишите мне. Доверьтесь мне. Это будет работать в краткосрочной и долгосрочной перспективе.
ОБНОВЛЕНИЕ 2013-07-02 15:08 ПО ВОСТОЧНОМУ ВРЕМЕНИ
В этом отношении у меня есть предостережение, которое я обновлял в других своих постах, но я пропустил это: я обновляю свой ответ немного больше с помощью innodb_fast_shutdown, потому что я использовал для перезапуска mysql и остановки mysql, чтобы сделать это. Теперь этот один шаг жизненно важен, потому что у каждой незафиксированной транзакции могут быть другие движущиеся части внутри и за пределами журналов транзакций InnoDB ( см. Инфраструктура InnoDB ).
Обратите внимание, что установка innodb_fast_shutdown в 2 также очистит журналы, но больше движущихся частей все еще существует и будет выбрано в Crash Recovery во время запуска mysqld. Установка 0 лучше.