Чому всі таблиці MySQL InnoDB фрагментовані?


10

Чомусь всі таблиці InnoDB на моєму сервері MySQL перераховані як фрагментовані, коли я запускаю mysqltuner. Я встановив сервер лише кілька годин тому (на OSX Lion), і в ньому є купа свіжих даних, імпортованих із пакетних файлів.

Я спробував перетворити всі таблиці в одній базі даних на MYISAM, і, напевно, кількість фрагментованих таблиць зменшилась. Як не дивно, як тільки я перетворив ці таблиці назад в InnoDB, кількість роздроблених таблиць знову знімалася. Це суперечить моєму дослідженню на даний момент, яке говорить про те, що біг ALTER TABLE table_name ENGINE=INNODB;повинен виправити фрагментацію.

Після трохи гуглив я побіг:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Яка нібито перераховує всі фрагментовані таблиці (вона дійсно повертає таку ж кількість результатів, що і виходи mysqltuner для кількості фрагментованих таблиць). Кожен запис містить точно однакове число у data_free_MBстовпці (наразі 7,00000000).

Це насправді реальна проблема чи щось mysqltuner робить не так? Якщо це проблема, як її виправити?

EDIT

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


Ви дійсно думаєте, що 7 безкоштовних МБ - це проблема?
Девід Шварц

@DavidSchwartz Не поняття, тому я запитав;) Є 2314 таблиць, у кожній з яких 7 МБ безкоштовно, і я не знаю, що це означає. Я не впевнений, чому mysqltuner показав би мені цю цифру, якщо це не потенційна причина для занепокоєння. Я сподівався, що хтось тут, можливо, зможе сказати мені, наскільки це стосується того, щоб дати номери, і що я можу зробити, щоб пом'якшити проблему, оскільки «стандартні» методи не працюють
Clive

Перенесення цього питання відповідно до запиту користувача у прапорі.
Даніель Бек

Більшість деталей, які показує mysqltuner, призначені лише для ознайомлення. Не все є проблемою. Якщо це проблема, то це буде чітко сказано. Це було вказано як проблему?
Джон Гарденєр

@JohnGardeniers Я так вважаю, повідомлення таке: [!!] Total fragmented tables: 2314що, я впевнений, вказує на проблему (з подвійними червоними знаками оклику)
Clive

Відповіді:


5

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


3

Коли ви ввімкнули innodb_file_per_table , все, що ви зробили, - це налаштування протоколу для створення будь-яких нових таблиць InnoDB, створених у зовнішньому .ibdфайлі. Усі таблиці InnoDB, які ви створили до цього, все ще вкладені в ibdata1.

Якщо вимкнено innodb_file_per_table, будь-який час запуску

ALTER TABLE table_name ENGINE=INNODB;

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

РЕКОМЕНДАЦІЯ

Вам потрібно буде експортувати всі дані, видалити ibdata1, ib_logfile0, ib_logfile1 та перезавантажити.

Я написав, як і навіщо це робити

ОНОВЛЕННЯ 2012-08-15 12:05 EDT

Можливо, ви захочете переглянути сам сценарій mysqltuner.pl. IMHO Я думаю, що він використовує стару формулу для вимірювання фрагментації. Переконайтеся, що у вас є остання версія mysqltuner.

Щодо вимірювання фрагментації таблиць InnoDB, що зберігаються зовні, я написав пост про це ще 11 квітня 2012 року (Дивіться оновлення внизу 19 квітня 2012 року)


1
Ах, гаразд, зараз справи мають набагато більше сенсу, дякую. Я закінчив експорт даних, повністю витерши MySQL, потім перевстановив (але додавши innodb_file_per_tableдо файлу conf перед запуском сервера та повторним імпортом). До цього я отримував всілякі помилки InnoDB (справді погані види ... ті, що означали, що мені довелося запускати з innodb_force_recoveryрівня 6 просто для того, щоб отримати дані!), І всілякі "дати файлу журналу в майбутнє!' помилки. Вони, здається, зупинилися зараз, але у мене все ще є досить розрізнені таблиці. Я просто пильную це, ще раз дякую за вклад
Clive

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