По какой-то причине все таблицы 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 и перезагрузить.
Я написал как и зачем это делать
Oct 29, 2010
: Как: очистить механизм хранения MySQL InnoDB?Jul 05, 2012
: Переместите ibdata1, установите innodb_data_file_pathВы можете изучить сам скрипт mysqltuner.pl. ИМХО, я думаю, он использует старую формулу для измерения фрагментации. Убедитесь, что у вас установлена последняя версия mysqltuner.
Что касается измерения фрагментации таблиц InnoDB, хранящихся извне, Я написал об этом сообщение 11 апреля 2012 г. (см. Обновление внизу за 19 апреля 2012 г.)