MySQL InnoDB - мінуси innodb_file_per_table?


32

За замовчуванням MySQL InnoDB зберігає всі таблиці всіх БД в одному глобальному файлі. Ви можете змінити це, встановивши в конфігурацію innodb_file_per_table, який потім створює один файл даних для кожної таблиці.

Мені цікаво, чому innodb_file_per_tableце не включено за замовчуванням. Чи є недоліки його використання?

Відповіді:


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 (мультивалюючий контроль за сумісністю)
    • Відхилення сегментів
    • Скасувати пробіл
  • Метадані таблиці (Словник даних)
  • Подвійний буфер запису (фоновий запис для запобігання надійності на кешування ОС)
  • Вставити буфер (керування змінами не унікальних вторинних індексів)
  • Дивіться Pictorial Representation of ibdata1

Ось гарантований спосіб зменшити файл ibdata1 майже назавжди ...

КРОК 01) MySQLDзавантажте всі бази даних у текстовий файл 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 DBA, не так багато, як єдиної проблеми після цього. Насправді, коли я це зробив, я згорнув файл ibdata1 об'ємом 50 ГБ в 50 Мб.

Спробувати. Якщо у вас є додаткові запитання щодо цього, напишіть мені електронну пошту. Довірся мені. Це буде працювати в короткостроковій перспективі та в довгостроковій перспективі.

ОНОВЛЕННЯ 2013-07-02 15:08 EDT

У цьому відношенні є застереження, яке я оновлював у інших своїх посадах, але це пропустив: я трохи більше поновлював свою відповідь за допомогою innodb_fast_shutdown, оскільки для цього я перезапускав mysql і зупиняв mysql. Тепер цей крок є життєво важливим, оскільки кожна транзакція, що не відбулася, може мати інші рухомі частини всередині та поза журналами транзакцій InnoDB ( див. InnoDB Infrastructure ).

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


Чудова інформація - спасибі! 50 Гб >> 50 Мб - це дуже вражає!
UpTheCreek

Привіт, я намагався зробити саме так, як ви тут писали, "єдиною" проблемою є те, що сервер не запускається після цього. якщо я сервіс mysql запускаю, він просто висить там. Якщо я переключу свій старий файл cnf, все нормально. У вас є якісь підказки щодо цього?
Nicola Peluchetti

Це запитання до Ніколи: Ви зробили крок 5 ???
RolandoMySQLDBA

Ще одне питання до @Nicola: Скільки оперативної пам’яті у вас в системі ???
RolandoMySQLDBA

2
Будь обережний! Параметр innodb_fast_shutdown=0повинен бути встановлений в MySQL, перш ніж вимкнути його, щоб видалити файли журналу! ( ib_logfile0і ib_logfile1) Інакше ви можете втратити дані!
Тотор

12

Дивіться про помилку .

Чи є недоліки його використання?

  • більше відкритих файлів
  • відкрити / знову відкрити накладні
  • .ibd файл не скорочується (див. 1 , 2 )

Я завжди використовую innodb_file_per_table у великих базах даних.


Навіть якщо ви не використовуєте його, файли ibdata також не зменшуватимуться :(
minaev

1
Спасибі. Мені також цікаво, чому немає можливості мати файл на db?
UpTheCreek

1
@UpTheCreek, таблиці є сутностями. Бази даних - це логічні групи сутностей, а не суб'єкти власного права. Це більш очевидно з MyISAM, де бази даних - це каталоги, а таблиці - файли.
John Gardeniers

Просто хотілося б відзначити, що в той час як .ibd файли не без стиснення автоматично , ні робить ibdata1, альтернативу в файл через-таблиці. Принаймні, можна зменшити .ibd, використовуючи optimize table, що тривіально порівняно зі скороченням ibdata1.
RomanSt

8

innodb_file_per_table увімкнено за замовчуванням у MariaDB.


1
Не в моїй (версія за замовчуванням у CentOS 7). Вам потрібен еквівалент MySQL 5.6.6 або новіший. Інакше значення за замовчуванням вимкнено .
Гонки легкості з Монікою

2

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

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

Наприклад, сховище моєї бази даних з моїми базами даних WordPress та кількома іншими невеликими базами даних (phpBB, dev, деякі тести AMP тощо), перетворення на таблицю змінило її з 32MB на 50MB, і це навіть не включає те, ibdata1що все ще вимагає більш мінімум 10MB , в цілому , по крайней мере 60MB.

Як я вже говорив, це може бути не надто великою проблемою для деяких людей, особливо підприємств, але якщо ви є домашнім користувачем, який розміщує лише ваш сайт, блог тощо, то це дійсно може бути фактором у таких речах, як вибір хост-провайдер, оскільки багато хостів обмежують розмір вашої бази даних на додаток до загального використання диска.


1
Я думав, що ти збився (хто дбає про десять мегабайт ???), поки ти не зрозумів про жорсткі квоти у хостинг-провайдерів. Ніколи б про це не подумав.
Дан Пріттс

@DanPritts, особливо безкоштовні хости. Крім того, у вас може бути гігантський драйв, але це не кожен. За останній рік я розширив свій основний розділ даних з 1 ГБ до 2 ГБ, тому що він був занадто щільним, але навіть 10 Мб тут і 10 МБ (особливо з файлами журналів) можуть швидко з'їсти його. Плюс до цього, не забувайте, що накопичувачі кластера також складаються. Нарешті, це навіть не обов'язково жорсткий диск . Наприклад, на даний момент я “порталізую” свій веб-сайт, щоб я міг розмістити його в будь-якій системі, тому флеш-пам’ять 2 ГБ вже обмежений. Таким чином, збереження розмірів малих та уникнення запису є критично важливим. А тут є вбудовані системи!
Synetech

Плюс, це не 10 Мб (це абсолютний мінімальний розмір для IBDATA1). Він пішов від 30 Мб до ~ 85 МБ. Видаливши все це та імпортувавши дамп з нуля, я закінчив 69MB замість попередніх 30MB (можна здогадатися, яка база даних займала більше половини ☺). Чомусь, незважаючи на використання за столом, у мене ibdata1все ще 18 МБ. ☹
Synetech

Звучить, як щось, що я мав із встановленням CMS у порівнянні з одним без включення selinux, судячи з розмірів файлів 32M проти 50M. Я не можу по-справжньому вірити цифрам, скільки у вас навіть баз даних, що метадані деяких файлів можуть досягати розміру MEGABYTES в ідентичних системах?
sjas

2

Просто, щоб додати трохи більше інформації

Оскільки mysql 5.6.6 його включено за замовчуванням


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