Очистка файла mysql ibdata1
ibdata1 хранит данные таблиц (кроме схем — они хранятся в других файлах), индексы и некоторую другую информацию. Этот файл нельзя просто удалить, так как это приведет к уничтожению данных таблиц. Кроме того файл ibdata1 фактически не может быть сокращен в размере, если только вы не удалите все базы данных, не удалите файлы и не перезагрузите дамп.
С целью оптимизации потребления дискового пространства файлом ibdata1 я предлагаю комплексный подход: настроить MySQL на использование отдельных файлов для каждой таблицы и затем освобождение дискового пространства, занятого файлом ibdata1 :
Чтобы настроить сервер для использования отдельных файлов для каждой таблицы, в my.cnf добавьте следующую директиву:
Что хранится в файле /var/lib/mysql/ibdata1?
Что хранится в файле /var/lib/mysql/ibdata1 и почему он все время увеличивается. У нас объем суммы всех меньше 100гб, а этот файл весит почти терабайт, вопрос что там еще хранится и почему невозможно уменьшить его?
- Вопрос задан более трёх лет назад
- 5795 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 3
Еда — это святое
Данные там хранятся, для таблиц, которые используют InnoDB
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
В этом файле хранятся данные таблиц, индексы и другая служебная информация InnoDB.
Используйте параметр innodb_file_per_table, чтобы сконфигурировать MySQL для хранения информации в отдельных файлах, это позволит сократить размер.
[mysqld] innodb_file_per_table=1
Чтобы перенастроить табличное пространство, нужно будет удалить все существующие базы данных, или сменить их подсистему хранения.
Вы не можете удалить файл данных из системного табличного пространства. Чтобы уменьшить размер системного табличного пространства, используйте следующую процедуру:
- Используйте mysqldump для вывода всех ваших таблиц InnoDB, включая таблицы InnoDB, расположенные в базе данных MySQL.
- Остановите сервер.
- Удалите все существующие файлы табличного пространства (* .ibd), включая файлы ibdata и ib_log. Не забудьте удалить * .ibd файлы для таблиц, расположенных в базе данных MySQL.
- Настройте новое табличное пространство.
- Перезагрузите сервер.
- Импортируйте файлы дампа.
Примечание: если в ваших базах данных используется только механизм InnoDB, может быть проще сбросить все базы данных, остановить сервер, удалить все базы данных и файлы журналов InnoDB, перезапустить сервер и импортировать файлы дампа.
Форум
В папке OpenServer\userdata\MySQL-5.5, есть файл ibdata1. У меня, при 2-х (не большие +- 1,5 Мб) БД, он занимает аж 23,2 Гб.
Подскажите плз, что это за файл? Можно ли его безболезненно удалить (все же 23 Гб — многовато. )
Максим Сообщения: 6022 Зарегистрирован: 11 дек 2010, 20:29
Re: ibdata1 что это?
Это файл баз данных в формате innoDB. Его особенность в том, что если вы создали базу размером 23 гигабайта, а потом её удалили, то файл не уменьшается в размере. Свободное место в нём просто остаётся на будущее для других баз данных. Если вам это не нравится то пересоздайте все базы путём импорта/экспорта одним sql файлом или используйте MyISAM формат бд.
Dgikar Сообщения: 11 Зарегистрирован: 13 июн 2012, 17:56
Re: ibdata1 что это?
Максим, спасибо за ответ.
Я правильно понимаю, что, если я, пересоздам БД, этот файл уменьшиться? Или его, сейчас можно удалить, а потом пересоздать БД и все будет дальше ОК? Как правильно сделать?
DelphinPRO Сообщения: 856 Зарегистрирован: 01 фев 2012, 17:27 Откуда: Самара
Re: ibdata1 что это?
или используйте MyISAM формат бд.
А вот этого делать я бы не советовал ни при каких условиях. myisam — нетранзакционное хранилище без внешних ключей и этим всё сказано
Максим Сообщения: 6022 Зарегистрирован: 11 дек 2010, 20:29
Re: ibdata1 что это?
Dgikar, импортируете все базы в один файл с опцией пересоздания таблиц. Убеждаетесь что информация в файле корректна, а не какие нибудь там кракозяблы или знаки вопросов вместо данных. Останавливаете сервер. Потом удаляете ibdata1, ib_logfile0, ib_logfile1. Потом запускаете сервер и импортируете файл с базами.
keilman Сообщения: 10 Зарегистрирован: 20 авг 2015, 16:10
Re: ibdata1 что это?
DelphinPRO писал(а): А вот этого делать я бы не советовал ни при каких условиях. myisam — нетранзакционное хранилище без внешних ключей и этим всё сказано
Вы уж так категорично не отвечали бы!
Сначала нужно узнать, для чего человек использует базу данных, что хранит, какой объем и др.
Я бы сказал, что в большинстве случаев лучше подходит myisam чем innodb.
DelphinPRO Сообщения: 856 Зарегистрирован: 01 фев 2012, 17:27 Откуда: Самара
Re: ibdata1 что это?
UPD
В прошлый раз некогда было. Сейчас напишу.
Вам важна целостность ваших данных? Думаю да. Представим сферическую БД в вакууме. В ней несколько взаимосвязанных таблиц. При изменении одной таблицы вам необходимо сделать синхронные апдейты в парочке других. Вы начинаете изменять одну таблицу, потом вторую, и тут, бац! — какой-то сбой. Неважно что произошло, суть в том, что последнюю таблицу мы не успели изменить и данные в ней некорректные. Если в этой таблице хранится список котиков, загруженных пользователем на сайт, это не так страшно, как если бы речь шла о финансовых операциях, но для того пользователя это все же важно.
Какой выход вы видите для исключения подобных ситуаций? Лично я вижу только один — обернуть все операции с таблицами в транзакцию. Но MyIsam понятия не имеет о транзакциях. И шо делать.
Про использование внешних ключей, коих тоже нет в MyIsam я пожалуй промолчу, и так увлекся.
Удаление ibdata1
Столкнулся с привычной проблемой: есть сервер MySQL, все таблицы в InnoDB, файл ibdata1 более 70 гигабайт. Надо его облегчить, плюс надо включить file_per_table для всех баз.
В интернете есть куча советов как удалить файл ibdata1, что бы он был пересоздан. В большинстве инструкций всё сводится к
- Сдампить все базы
- Удалить все базы
- Остановить сервер
- Удалить ibdata1, ib_logfile0, ib_logfile1
- Запустить сервер
- Восстановить все базы.
Ничего сложного, но есть одна проблема: одна из моих баз просто не поместится на диск, если её сдампить. И даже если решить этот вопрос, всё равно восстанавливаться база в сотню гигабайт с индексами будет крайне долго.
База эта была изначально сделана в InnoDB и все данные её таблиц разложены по отдельным файлам (file_per_table был включён до создания базы).
Собственно вопрос: можно ли безболезненно выполнить описанную выше инструкцию, не дампя эту огромную базу?
Боюсь, что после перезапуска MySQL не подхватит базу из файлов автоматом и всё сломается. Так ли это или можно не опасаться?
MacDeveloper
06.07.15 19:38:00 MSK
Боюсь, что после перезапуска MySQL не подхватит базу из файлов автоматом и всё сломается. Так ли это или можно не опасаться?
На днях у меня крешанулась база с innodb таблицами. Насколько я выяснил из-за бедов. База всего 7гиг и были бекапы. Если при копировании файлов myisam таблицы успешно подхватываются, то с innodb это не происходит, хотя у меня таблицы были распределены по отдельных файлах. Насколько я выяснил из гугла, в ibdata1 как раз хранятся айдишники на таблицы и поэтому когда я создал новый ibdata1, то мускул просто был не в курсе про дополнительные таблицы. Поэтому думаю, что стоит использовать инструкции из поста, чтобы все наверняка сработало
kiotoze ★★★★
( 06.07.15 20:27:55 MSK )
Последнее исправление: kiotoze 06.07.15 20:28:56 MSK (всего исправлений: 2)
Ну читайте же доки, есть прям спецательная статья на эту тему — как копировать file-per-table базы: http://dev.mysql.com/doc/refman/5.6/en/tablespace-copying.html
blind_oracle ★★★★★
( 06.07.15 20:50:01 MSK )
одна из моих баз просто не поместится на диск, если её сдампить
Ответ очевиден: бэкапь на удаленный хост, где есть место для базы
mysqldump very_large_database | ssh remote_host 'cat >very_large_database.sql'
Восстановление — примерно по такой же схеме, только наоборот(сначала ssh, потому — mysql)
Pinkbyte ★★★★★
( 07.07.15 09:49:15 MSK )
Последнее исправление: Pinkbyte 07.07.15 09:49:25 MSK (всего исправлений: 1)