Ibdata1 что за файл

Обновлено: 02.07.2024

Столкнулся с привычной проблемой: есть сервер MySQL, все таблицы в InnoDB, файл ibdata1 более 70 гигабайт. Надо его облегчить, плюс надо включить file_per_table для всех баз.

В интернете есть куча советов как удалить файл ibdata1, что бы он был пересоздан. В большинстве инструкций всё сводится к

  • Сдампить все базы
  • Удалить все базы
  • Остановить сервер
  • Удалить ibdata1, ib_logfile0, ib_logfile1
  • Запустить сервер
  • Восстановить все базы.

Ничего сложного, но есть одна проблема: одна из моих баз просто не поместится на диск, если её сдампить. И даже если решить этот вопрос, всё равно восстанавливаться база в сотню гигабайт с индексами будет крайне долго.

База эта была изначально сделана в InnoDB и все данные её таблиц разложены по отдельным файлам (file_per_table был включён до создания базы).

Собственно вопрос: можно ли безболезненно выполнить описанную выше инструкцию, не дампя эту огромную базу?

Боюсь, что после перезапуска MySQL не подхватит базу из файлов автоматом и всё сломается. Так ли это или можно не опасаться?


Боюсь, что после перезапуска MySQL не подхватит базу из файлов автоматом и всё сломается. Так ли это или можно не опасаться?

На днях у меня крешанулась база с innodb таблицами. Насколько я выяснил из-за бедов. База всего 7гиг и были бекапы. Если при копировании файлов myisam таблицы успешно подхватываются, то с innodb это не происходит, хотя у меня таблицы были распределены по отдельных файлах. Насколько я выяснил из гугла, в ibdata1 как раз хранятся айдишники на таблицы и поэтому когда я создал новый ibdata1, то мускул просто был не в курсе про дополнительные таблицы. Поэтому думаю, что стоит использовать инструкции из поста, чтобы все наверняка сработало

kiotoze ★★★★ ( 06.07.15 20:27:55 )
Последнее исправление: kiotoze 06.07.15 20:28:56 (всего исправлений: 2)


одна из моих баз просто не поместится на диск, если её сдампить

Ответ очевиден: бэкапь на удаленный хост, где есть место для базы

Восстановление - примерно по такой же схеме, только наоборот(сначала ssh, потому - mysql)

Решение проблемы слишком большого размера файла MySQL ibdata1

Что такое файл ibdata1?

ibdata1 - это файл, используемый для построения системного табличного пространства innodb. Этот файл содержит метаданные таблицы innodb, записи отмены, буфер изменения и буфер двойной записи. Если включен параметр «файл для таблицы», файл может содержать не все данные таблицы. Когда опция innodb_file_per_table включена, данные и индексы вновь созданной таблицы не будут храниться в системном табличном пространстве, а будут сохранены в файле .ibd соответствующей таблицы.

Очевидно, этот файл будет становиться все больше и больше. Параметр innodb_autoextend_increment определяет шаг автоматического увеличения файла каждый раз. Значение по умолчанию - 8M.

Что заставляет файл ibdata1 становиться все больше и больше?

ibdata1 хранит данные, индексы, кеши и т. д. Это самые важные данные MYSQL. Так что по мере того, как база данных становится все больше и больше, таблица будет становиться все больше, и это неизбежно. Если время будет все больше и больше, нам будет не так удобно иметь дело с журналами и пространством, и мы не знаем, с чего начать. Затем мы должны разобраться с этой ситуацией и сохранить данные в подбазе данных.

Как с этим бороться?

Сначала мы создаем резервную копию файла базы данных, а затем напрямую удаляем файл ibdata (на всякий случай лучше подготовить его один раз, чтобы обеспечить безопасность и полноту данных), а затем повторно импортируем файл базы данных!

Конкретные шаги заключаются в следующем (снимки экрана не полные, но вы должны сначала понять общую ситуацию и принципы):

1. Остановите бизнес и сделайте резервную копию всей базы данных один раз.

mysqldump -uroot -ppassword --all-databases --add-dorp-table > /root/all_mysql.sql

2. После завершения резервного копирования остановите базу данных.

3. Измените файл конфигурации.

mysql -uroot -ppassword mysql

show variables like '%per_table%';

+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| innodb_file_per_table | ON |

+-----------------------+-------+

1 row in set (0.00 sec)

Статус innodb_file_per_table становится ВКЛ.

5. Удалите файлы и журналы ibdata1.

6. Восстановите базу данных.

mysql -uuser -ppassword

source /root/all_mysql.sql

Файлы данных хранятся отдельно (общее табличное пространство заменяется независимым файлом табличного пространства для каждой таблицы).

Интеллектуальная рекомендация

совместный запрос mysql с тремя таблицами (таблица сотрудников, таблица отделов, таблица зарплат)

1. Краткое изложение проблемы: (внизу есть инструкция по созданию таблицы, копирование можно непосредственно практиковать с помощью (mysql)) Найдите отделы, в которых есть хотя бы один сотрудник. Отоб.


[Загрузчик классов обучения JVM] Третий день пользовательского контента, связанного с загрузчиком классов


IP, сеанс и cookie

Зайдя в панель управления Webmin, я заметил, что практически все мое дисковое пространство заполнено. Я искал десять самых больших файлов / каталогов в моей системе и обнаружил, что файл с именем ibdata1 занимает около 94 ГБ пространства. Он находится в моем / var / lib / mysql каталоге.

Что делает ibdata1? Я в безопасности, чтобы удалить это? Я предполагаю, что это какая-то свалка, но это просто дикая догадка.

Файл ibdata1 является системным табличным пространством для инфраструктуры InnoDB.

Он содержит несколько классов для информации, жизненно важной для InnoDB

Обратите внимание на место ibdata1 во вселенной InnoDB (справа)

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

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

    - это / 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

    • Oct 29, 2010 : Мой оригинальный пост в StackOverflow
    • Nov 26, 2011 : ОШИБКА 1114 (HY000) в строке 6308 в файле & Таблица user_analysis заполнена
    • Feb 03, 2012 : Плановая оптимизация таблиц в MySQL InnoDB
    • Mar 25, 2012 : Почему InnoDB хранит все базы данных в одном файле?
    • Apr 01, 2012 : Желательно ли использовать innodb_file_per_table?

    Вы можете продолжать хранить в ibdata1 все, но это делает создание снимков LVM настоящим трудоемким делом (мое личное мнение).

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

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

    Это скажет, сколько потраченного пространства может быть восстановлено после применения InnoDB Cleanup.

    90 ГБ, куда некуда деваться.

    mysqldump будет только логическое представление страниц данных, а не индексов. Вам понадобится другое монтирование диска, возможно, удаленный сервер, чтобы сбросить данные. Это возвращает 91.25350952148438 для меня как SpaceToReclaim . Это в мегабайтах? процент? байт? Я знаю, что это слишком старо. Но для любого, кто придет сюда с проблемой, вам нужно заменить число 94 на любой размер вашего ibdata1 файла в ГБ, и SpaceToReclaim он даст вам размер в ГБ.

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

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

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

    Войдя на панель управления Webmin, я заметил, что практически все мое дисковое пространство заполнено. Я искал десять самых больших файлов /каталогов в моей системе и обнаружил, что файл с именем ibdata1 занимает около 94 ГБ пространства. Он находится в каталоге my /var /lib /mysql.

    Что делает ibdata1? Можно ли удалить его? Мое предположение заключается в том, что это свалка, но это просто дикая догадка.

    3 ответа

    Файл ibdata1 - это системное табличное пространство инфраструктуры InnoDB.

    Он содержит несколько классов для информации, жизненно важной для InnoDB

    Обратите внимание на место ibdata1 в UniverseDB Universe (справа)

    Архитектура 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

      • Oct 29, 2010 : Мой оригинальный пост в StackOverflow
      • Nov 26, 2011 : ОШИБКА 1114 (HY000) в строке 6308 в файле & Таблица user_analysis полна
      • Feb 03, 2012 : Плановая оптимизация таблиц в MySQL InnoDB
      • Mar 25, 2012 : Почему InnoDB хранит все базы данных в одном файле?
      • Apr 01, 2012 : Рекомендуется ли использовать innodb_file_per_table?

      Вы можете продолжить с сохранением ibdata1, но это делает выполнение снимков LVM реальной тяжести (мое личное мнение).

      Запустите этот запрос:

      Это покажет, сколько потерянного пространства может быть исправлено после применения InnoDB Cleanup.

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

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

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

      Читайте также: