MySQL InnoDB - минусы innodb_file_per_table?

32

По умолчанию MySQL InnoDB хранит все таблицы всех БД в одном глобальном файле. Вы можете изменить это, установив innodb_file_per_table в конфигурации, которая затем создает один файл данных для каждой таблицы.

Мне интересно, почему innodb_file_per_tableне включен по умолчанию. Есть ли недостатки в его использовании?

UpTheCreek
источник

Ответы:

32

У меня есть полный ответ на этот.

Как только innodb_file_per_table будет введен в действие, и новые таблицы InnoDB могут быть сокращены, используя ALTER TABLE <innodb-table-name> ENGINE=InnoDB';Это уменьшит новые .ibdфайлы, ГАРАНТИРУЕМЫЕ.

Если вы запустите ALTER TABLE <innodb-table-name> ENGINE=InnoDB';таблицу InnoDB, созданную до того, как вы использовали innodb_file_per_table, она извлечет данные и индексы для этой таблицы из файла ibdata1 и сохранит их в .ibdфайле. Это оставит в ibdata1 постоянное целое голубя, которое никогда не будет использовано повторно. ,

ibdata1Файл обычно находится четыре типа информации

  • Данные таблицы
  • Табличные индексы
  • Данные MVCC (Multiversioning Concurrency Control)
    • Откат сегментов
    • Отменить пространство
  • Метаданные таблицы (словарь данных)
  • Double Write Buffer (фоновая запись для предотвращения зависимости от кэширования ОС)
  • Вставить буфер (управление изменениями в неуникальных вторичных индексах)
  • Увидеть Pictorial Representation of ibdata1

Вот гарантированный способ сжать файл ibdata1 почти навсегда ...

ШАГ 01) MySQLDump все базы данных в текстовый файл SQL (назовите его SQLData.sql)

ШАГ 02) Удалите все базы данных (кроме схем mysql, information_schema и performance_schema)

ШАГ 03) Отключение mysql

ШАГ 04) Добавьте следующие строки в /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend

Примечание. Независимо от того, какой у вас набор для innodb_buffer_pool_size, убедитесь, что innodb_log_file_size составляет 25% от innodb_buffer_pool_size.

  • ШАГ 05) Удалите ibdata1, ib_logfile0 и ib_logfile1 ( см. Обновление ниже перед удалением! )

На этом этапе должна быть только схема mysql в / var / lib / mysql

  • ШАГ 06) Перезапустите MySQL

Это восстановит ibdata1 на 10 МБ (не настраивать опцию), ib_logfile0 и ib_logfile1 на 1G каждый

  • ШАГ 07) Перезагрузите SQLData.sql в mysql

ibdata1 будет расти, но будет содержать только метаданные таблицы и прерывистые данные MVCC.

Каждая таблица InnoDB будет существовать вне ibdata1

Предположим, у вас есть таблица InnoDB с именем mydb.mytable. Если вы войдете в /var/lib/mysql/mydb, вы увидите два файла, представляющих таблицу

  • mytable.frm (Заголовок механизма хранения)
  • mytable.ibd(Главная таблицы данных и табличных индексов для mydb.mytable)

ibdata1 никогда не будет содержать данные InnoDB и индексы.

С опцией innodb_file_per_table/etc/my.cnf вы можете запустить OPTIMIZE TABLE mydb.mytableИЛИ, ALTER TABLE mydb.mytable ENGINE=InnoDB;и файл /var/lib/mysql/mydb/mytable.ibdбудет фактически уменьшен.

Я делал это много раз за свою карьеру в качестве администратора баз данных MySQL, не испытывая при этом ни единой проблемы. Фактически, в первый раз, когда я сделал это, я свернул файл ibdata1 размером 50 ГБ в 50 МБ.

Попробуйте. Если у вас есть дополнительные вопросы по этому поводу, напишите мне. Доверьтесь мне. Это будет работать в краткосрочной и долгосрочной перспективе.

ОБНОВЛЕНИЕ 2013-07-02 15:08 ПО ВОСТОЧНОМУ ВРЕМЕНИ

В этом отношении у меня есть предостережение, которое я обновлял в других своих постах, но я пропустил это: я обновляю свой ответ немного больше с помощью innodb_fast_shutdown, потому что я использовал для перезапуска mysql и остановки mysql, чтобы сделать это. Теперь этот один шаг жизненно важен, потому что у каждой незафиксированной транзакции могут быть другие движущиеся части внутри и за пределами журналов транзакций InnoDB ( см. Инфраструктура InnoDB ).

Обратите внимание, что установка innodb_fast_shutdown в 2 также очистит журналы, но больше движущихся частей все еще существует и будет выбрано в Crash Recovery во время запуска mysqld. Установка 0 лучше.

RolandoMySQLDBA
источник
Отличная информация - спасибо! 50GB >> 50MB - это впечатляет!
UpTheCreek
Привет, я пытался сделать именно так, как вы написали здесь, «единственная» проблема заключается в том, что сервер не запускается после этого. если я делаю сервис MySQL запуска, он просто висит там. Если я вернусь к своему старому файлу cnf, все будет в порядке. Есть ли у вас какие-либо подсказки по этому поводу?
Никола Пелучетти
Этот вопрос к Никола: ты сделал Шаг 5 ???
RolandoMySQLDBA
Еще один вопрос для @Nicola: сколько оперативной памяти у вас в системе ???
RolandoMySQLDBA
2
Быть осторожен! Опция innodb_fast_shutdown=0должна быть установлена ​​в MySQL, прежде чем отключить ее, чтобы удалить файлы журнала! ( ib_logfile0и ib_logfile1) В противном случае вы можете потерять данные!
Тотор
12

Смотри баг .

Есть ли недостатки в его использовании?

  • больше открытых файлов
  • открыть / открыть накладные расходы
  • Файл .ibd не сжимается (см. 1 , 2 )

Я всегда использую innodb_file_per_table в больших базах данных.

alvosu
источник
Даже если вы не используете его, файлы ibdata также не будут уменьшаться :(
minaev
1
Спасибо. Мне также интересно, почему нет возможности иметь файл на базу данных?
UpTheCreek,
1
@UpTheCreek, таблицы являются сущностями. Базы данных представляют собой логические группы объектов, а не объекты сами по себе. Это более очевидно с MyISAM, где базы данных являются каталогами, а таблицы - файлами.
Джон Гарденье
Хотелось бы отметить, что, хотя файлы .ibd не сжимаются автоматически , также не существует ibdata1альтернативы файлу на таблицу. По крайней мере, можно уменьшить использование .ibd optimize table, что тривиально по сравнению с сокращением ibdata1.
RomanSt,
8

innodb_file_per_table включен по умолчанию в MariaDB.

Alex
источник
1
Не в моем (версия по умолчанию в CentOS 7). Вам нужен эквивалент MySQL 5.6.6 или новее. В противном случае значение по умолчанию выключено .
Легкость гонок с Моникой
2

Причина, по которой я решил не использовать innodb_file_per_table, состоит в том, что каждая таблица помещается в свой собственный файл, что означает, что каждая таблица получает свои собственные, отдельные издержки (подписи файлов и т. Д.), Что приводит к тому, что общий, общий размер MySQLкаталога будет больше, чем при использовании общего табличного пространства. Кроме того, из-за сбоя в работе кластера больше неиспользуемого пространства при наличии нескольких небольших файлов вместо одного большого файла.

Конечно, дополнительные издержки не являются огромной суммой в общей схеме вещей, особенно если вы используете большой диск или имеете гигантскую базу данных, но для меня (и, вероятно, многих «домашних пользователей») все это складывается и было все еще слишком много для маленького диска с большими кластерами, где я хранил свое хранилище MySQL.

Например, мой магазин базы данных с моей WordPress базы данных и несколько других небольших баз данных (PHPBB, Дев, некоторые тесты AMP и т.д.), преобразование в за столом изменил его от 32 МБ до 50 МБ, и даже не в том числе , ibdata1которые до сих пор требует более минимум 10MB , в общей сложности , по крайней мере 60MB.

Как я уже сказал, это может быть не слишком большой проблемой для некоторых людей, особенно для предприятий, но если вы являетесь домашним пользователем, который только размещает ваш сайт, блог и т. Д., То это действительно может быть фактором, влияющим на выбор хост-провайдер, потому что многие хосты ограничивают размер вашей базы данных в дополнение к общему использованию диска.

Synetech
источник
1
Я думал, что вы сошли с ума (кого волнует около десяти мегабайт ???), пока вы не поняли, что у хостинг-провайдеров есть жесткие квоты. Никогда бы не подумал об этом.
Дэн Притц
@DanPritts, особенно бесплатные хосты. Кроме того, у вас может быть гигантский драйв, но не у всех так. Я расширил свой основной раздел данных с 1 ГБ до 2 ГБ в прошлом году, потому что он был слишком тесным, но даже 10 МБ здесь и 10 МБ (особенно с файлами журналов) могут быстро его поглотить. Кроме того, не забывайте, что отходы кластеров тоже складываются. Наконец, это даже не обязательно жесткий диск . Например, в настоящее время я «портирую» свой веб-сайт, чтобы разместить его на любой системе, поэтому флеш-накопитель объемом 2 ГБ уже ограничен. Таким образом, сохранение размеров небольшого размера и избежание записи имеет решающее значение. И еще есть встроенные системы!
Synetech
Плюс, это не 10 МБ (это абсолютный минимальный размер для IBDATA1). Он пошел от 30 МБ до ~ 85 МБ. Удалив все это и импортировав дамп с нуля, я получил 69 МБ вместо предыдущих 30 МБ (одно предположение, какая база данных заняла более половины этого объема ☺). Почему-то, несмотря на использование таблицы, мой ibdata1по-прежнему 18 МБ. ☹
Synetech
Звучит скорее как то, что у меня было с установкой CMS с vs. one без включенного selinux, судя по размерам файлов 32M против 50M. Я не могу поверить цифрам, сколько у вас есть баз данных, которые могут содержать метаданные некоторых файлов размером до МЕГАБАЙТОВ в других идентичных системах?
Sjas
2

Просто чтобы добавить немного больше информации

Поскольку mysql 5.6.6 включен по умолчанию

PerroVerd
источник