По какой-то причине все таблицы 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 МБ предназначена для всего файла, а не для каждой таблицы. Кто-нибудь может подтвердить, так ли это?
[!!] Total fragmented tables: 2314
которое, я уверен, указывает на проблему (с двойными красными восклицательными знаками)Ответы:
Согласно моим комментариям выше, не все выходные данные из sqltuner указывают на ошибки. Если в сценарии очень четко не указано, что это проблема, обычно на следующей строке, за которой следуют предложения по исправлению, то это только информационный элемент.
источник
Когда вы включили innodb_file_per_table , все, что вы сделали, это настроили протокол для создания любых новых таблиц InnoDB во внешнем
.ibd
файле. Все таблицы InnoDB, которые вы создали до этого, все еще встроены в ibdata1.При отключенном innodb_file_per_table каждый раз при запуске
все, что он делает, это добавляет данные таблицы и индексные страницы в ibdata1. Это сделает таблицу существующей на смежных страницах и удалит фрагментацию. Недостатком является то, что ibdata1 быстро растет.
РЕКОМЕНДАЦИЯ
Вам нужно будет экспортировать все данные, удалить ibdata1, ib_logfile0, ib_logfile1 и перезагрузить.
Я написал как и зачем это делать
Oct 29, 2010
: Howto: Очистить движок хранения MySQL InnoDB?Jul 05, 2012
: Переместить ibdata1, установить innodb_data_file_pathОБНОВЛЕНИЕ 2012-08-15 12:05 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Возможно, вы захотите заглянуть в сам скрипт mysqltuner.pl. ИМХО Я думаю, что он использует старую формулу для измерения фрагментации. Убедитесь, что у вас установлена последняя версия mysqltuner.
Что касается измерения фрагментации таблиц InnoDB, хранимых извне, я написал сообщение об этом еще 11 апреля 2012 г. (см. Обновление внизу от 19 апреля 2012 г.)
источник
innodb_file_per_table
в файл conf перед запуском сервера и повторным импортом). До этого я получал всевозможные ошибки InnoDB (действительно плохие виды ... из-за которых мне приходилось работатьinnodb_force_recovery
на уровне 6 только для того, чтобы получить данные!), И всякие «дата файла журнала находится в будущее!' ошибки. Похоже, они прекратились, но у меня все еще есть несколько фрагментированных таблиц. Я просто буду следить за этим, еще раз спасибо за ввод