Що таке файл ibdata1 у каталозі / var / lib / mysql?


32

Увійшовши на панель управління Webmin, я помітив, що практично весь мій диск є заповненим. Я шукав десять найбільших файлів / каталогів у своїй системі і виявив, що файл під назвою ibdata1 займає близько 94 ГБ місця. Він знаходиться в каталозі / var / lib / mysql.

Що робить ibdata1? Чи безпечно її видалити? Моє припущення, що це якесь смітник, але це лише дика здогадка.

Відповіді:


38

Файл ibdata1є системним простором таблиць для інфраструктури InnoDB.

Він містить кілька класів для інформації, життєво важливої ​​для InnoDB

  • Сторінки даних таблиці
  • Сторінки покажчиків таблиць
  • Словник даних
  • Дані контролю MVCC
    • Скасувати пробіл
    • Відхилення сегментів
  • Подвійний буфер запису (Сторінки, написані на задньому плані, щоб уникнути кешування ОС)
  • Вставити буфер (зміни до вторинних індексів)

Зверніть увагу на місце ibdata1 у Всесвіті InnoDB (справа)

Архітектура InnoDB

Ви можете відокремити Сторінки даних та індексів від ibdata1включення innodb_file_per_table . Це спричинить будь-яку новостворену таблицю InnoDB для зберігання даних та індексних сторінок у зовнішньому .ibdфайлі.

Приклад

  • datadir є / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, створює /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table увімкнено, сторінки даних / покажчики зберігаються /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table вимкнено, сторінки даних / покажчики зберігаються в ibdata1

Незалежно від того, де зберігається таблиця InnoDB, функціональність InnoDB вимагає пошуку метаданих таблиці та зберігання та отримання інформації MVCC для підтримки відповідності ACID та ізоляції транзакцій .

Ось мої минулі статті про відокремлення даних таблиці та індексів від ibdata1

ЩО РОБИТИ НАСТУПНО

Ви можете продовжувати зберігати ibdata1 все, але це робить знімки LVM справжніми зухвальцями (моя особиста думка).

Вам потрібно використовувати My StackOverflow post і постійно зменшувати цей файл.

Будь ласка, запустіть цей запит:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Це покаже, скільки витраченого простору можна отримати після застосування InnoDB Cleanup.


Дякуємо за ваш внесок З тих пір моя квота на диск повністю заповнена - перш ніж я діятиму за будь-якою порадою у ваших публікаціях, чи знадобиться мені вільний простір? Зауважу, що у вашій початковій публікації про SO йдеться про те, щоб зробити дамп SQL, але це, мабуть, створило б файл ~ 90 ГБ нікуди.
Джеймс

mysqldump буде лише логічним поданням сторінок даних, а не індексами. Вам потрібно буде інше кріплення диска, можливо, віддалений сервер, щоб скинути дані.
RolandoMySQLDBA

9
Він повертає 91.25350952148438 для мене як SpaceToReclaim. Це в мегабайтах? відсотків? байт?
Ісаак

Я знаю, що це занадто давно. Але для всіх, хто приходить сюди з проблемою, вам потрібно замінити номер 94на будь-який розмір вашого ibdata1файлу в ГБ, і SpaceToReclaimвін надасть вам розмір у ГБ.
anupsabraham


2

Якщо ви використовуєте innodb як двигун MySQL за замовчуванням, він зберігатиме всі ваші бази даних в ibdata1. Також є файли журналів ib_logfile0 та ib_logfile1. Не видаляйте ці файли.


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