Назад | Перейти на главную страницу

Почему все таблицы MySQL InnoDB фрагментированы?

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

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

После небольшого поиска в Google я запустил:

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 делает что-то не так? Если это проблема, как мне ее исправить?

РЕДАКТИРОВАТЬ

У меня все больше и больше подозрений в том, что я идиот и что фрагментация 7 МБ предназначена для всего файла, а не для каждой таблицы. Может ли кто-нибудь подтвердить, так ли это?

Согласно моим комментариям выше, не весь вывод sqltuner указывает на ошибки. Если в сценарии очень четко не указано, что это проблема, обычно в следующей строке, сопровождаемой предложениями по исправлению, тогда это только информационный элемент.

Когда вы включили 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. ИМХО, я думаю, он использует старую формулу для измерения фрагментации. Убедитесь, что у вас установлена ​​последняя версия mysqltuner.

Что касается измерения фрагментации таблиц InnoDB, хранящихся извне, Я написал об этом сообщение 11 апреля 2012 г. (см. Обновление внизу за 19 апреля 2012 г.)