Це одна з найбільш суперечливих тем, якою я коли-небудь займався, як MySQL DBA та DBA StackExchange.
М’яко кажучи, іншого способу зменшити ibdata1 просто немає . Якщо вимкнено innodb_file_per_table , кожен раз, коли ви запускаєте OPTIMIZE TABLE
таблицю InnoDB, ibdata1 швидко зростає. Дані, які викидаються за допомогою DROP TABLE
та DROP DATABASE
не можуть бути повернуті назад, оскільки вони є DDL, а не DML. Я вважаю, що Oracle і MSSQL можуть відкатати DDL. MySQL не може цього зробити.
Існує кілька класів інформації, які містяться в ibdata1
- Дані таблиці
- Табличні покажчики
- Метадані таблиці
- Дані контролю MVCC
- Подвійний буфер запису (фонове записування для запобігання надійності в кешування ОС)
- Вставити буфер (Керування змінами не унікальних вторинних індексів)
Використання innodb_file_per_table=1
дозволить вам створити нові таблиці з табличними даними та табличними індексами, створеними поза ibdata1. Ви можете витягнути будь-які таблиці, які все ще знаходяться всередині ibdata1, використовуючи ALTER TABLE ... ENGINE=InnoDB;
або, OPTIMIZE TABLE
але це залишить цей великий розрив невикористаного простору в ibdata1.
Незважаючи на те, ви повинні очистити інфраструктуру InnoDB. Я вже писав публікації StackExchange про те, як і навіщо це робити:
Гарні новини
Вам потрібно лише скинути дані, перезавантажити ще раз і більше ніколи не переглядати цю проблему знову . Запуск OPTIMIZE TABLE
після цього дійсно зменшить .ibd
файл таблиці таблиць для будь-якої таблиці InnoDB.