Что такое файл 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 настоящим трудоемким делом (мое личное мнение).

Вам нужно использовать мой пост StackOverflow и окончательно сжать этот файл.

Пожалуйста, запустите этот запрос:

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.

RolandoMySQLDBA
источник
Спасибо за ваш вклад. Моя дисковая квота с тех пор полностью заполнена - прежде чем я буду действовать по любому из советов в ваших сообщениях, мне понадобится свободное место? Я отмечаю, что в вашем первоначальном посте на SO упоминается о создании дампа SQL, но это, вероятно, создаст файл размером ~ 90 ГБ, куда некуда деваться.
Джеймс
mysqldump будет только логическое представление страниц данных, а не индексов. Вам понадобится другое монтирование диска, возможно, удаленный сервер, чтобы сбросить данные.
RolandoMySQLDBA
9
Это возвращает 91.25350952148438 для меня как SpaceToReclaim. Это в мегабайтах? процент? байт?
Исаак
Я знаю, что это слишком старо. Но для любого, кто придет сюда с проблемой, вам нужно заменить число 94на любой размер вашего ibdata1файла в ГБ, и SpaceToReclaimон даст вам размер в ГБ.
Анупсабрахам
8

Этот файл ibdata1не, ibdatalи он содержит все ваши базы данных InnoDB. Если вы удалите его, вы потеряете все свои данные.

Некоторые идеи о том, как с этим бороться, см. В разделе Как сжать / очистить файл ibdata1 в MySQL .

Майкл Хэмптон
источник
2

Если вы используете innodb в качестве движка MySQL, по умолчанию все ваши базы данных будут сохранены в ibdata1. Также есть файлы журналов ib_logfile0 и ib_logfile1. Не удаляйте эти файлы.

silviud
источник
Что такое удалить этот файл на моем сервере?
Фрэнк