Як я скорочую файл inoddata1 innodb без скидання всіх баз даних?


24

InnoDB зберігає всі таблиці в одному великому файлі ibdata1.

Після випадання великої таблиці файл зберігає свій розмір незалежно від того, наскільки великою була таблиця. Як я можу скоротити цей файл, не вивантажуючи та повторно імпортуючи всю базу даних (яка має кілька сотень ГБ)?

Я думаю, що причина полягає в тому, що ти все ще можеш відкатати скидання. У моєму випадку мені цього не потрібно.

Відповіді:


30

Це одна з найбільш суперечливих тем, якою я коли-небудь займався, як 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.


1
Незначна корекція: MSSQL і PostgreSQL можуть повернути DDL. Oracle не може. Насправді Oracle видає неявну фіксацію, коли бачить DDL!
Кріс Траверс

1
@RolandoMySQLDBA з якої версії MySQL працює ця "добра новина" автоматичного скорочення?
Гавриель

@Gavriel - Я думаю, що ви неправильно прочитали. Вам ще доведеться скидати; видалити ibdata1; перезапустити; і перезавантажити. Немає автоматичного посилання на ibdata1. (Зміна iblog * тепер простіше.)
Рік Джеймс

2

InnoDB зберігає всі ваші таблиці InnoDB у ibdata1, якщо ви не використовуєте наступне налаштування у файлі за замовчуванням my.cnf:

innodb_file_per_table = 1

ТАБЛИКА ДРОПУВАННЯ (і ДРОПАЦІЯ ДРОПУВАННЯ) не може бути повернута назад.

Це не причина, коли ви не можете зменшити ibdata1.

Це скорочене пояснення, але ibdata1 містить внутрішні дані InnoDB на додаток до даних таблиці. З мого розуміння, для скорочення цього потрібно дефрагментація, що не підтримується операцією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.