Я маю повну відповідь на це.
Після того, як 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 найкраща.