Я маю повну відповідь на це.
Після того, як 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) MySQLDзавантажте всі бази даних у текстовий файл 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 DBA, не так багато, як єдиної проблеми після цього. Насправді, коли я це зробив, я згорнув файл ibdata1 об'ємом 50 ГБ в 50 Мб.
Спробувати. Якщо у вас є додаткові запитання щодо цього, напишіть мені електронну пошту. Довірся мені. Це буде працювати в короткостроковій перспективі та в довгостроковій перспективі.
ОНОВЛЕННЯ 2013-07-02 15:08 EDT
У цьому відношенні є застереження, яке я оновлював у інших своїх посадах, але це пропустив: я трохи більше поновлював свою відповідь за допомогою innodb_fast_shutdown, оскільки для цього я перезапускав mysql і зупиняв mysql. Тепер цей крок є життєво важливим, оскільки кожна транзакція, що не відбулася, може мати інші рухомі частини всередині та поза журналами транзакцій InnoDB ( див. InnoDB Infrastructure ).
Зауважте, що встановлення innodb_fast_shutdown на 2 очистить журнали також, але більше рухомих частин все ще існує і потрапляє на Crash Recovery під час запуску mysqld. Установка 0 найкраща.