Способы и средства мониторинга состояния таблиц MySQL?
В последнее время началась какая-то ерунда, время от времени ломаются таблицы. При этом таблица, например, может быть доступна для выборки, но недоступна для записи. Или вообще недоступна. Все, что нужно сделать, это выполнить REPAIR TABLE. Я не понимаю, почему сам Мускуль, понимая всю ситуацию, не может выполнить сам эту команду при поломке, ведь других средств починить таблицу вроде как и нет.
В связи с этим, собираюсь написать скрипт, который в полночь будет делать CHECK TABLE всех значимых таблиц и делать REPAIR поломанным.
Собственно, вопрос: это вообще нормальное решение? Существуют ли какие-то цивилизованные средства решения подобных проблем, какие-то утилиты для мониторинга или некий autorepair?
Если у Вас таблицы MyISAM — попробуйте заменить их на INNODB, нам в одном проекте это помогло. Насколько я понимаю, MyISAM плохо держит большие и часто обновляемые таблицы. Поэтому они и крашатся. А вообще — надо искать источник проблемы, скорее всего это жесткий диск (у вас RAID? ). По возможности кэшируйте запросы, чтобы разгрузить БД
Да, таблицы MyISAM, большие и часто обновляемые, все точно ) Но на InnoDB перейти пока нет возможности. При случае подумаю об этом, спасибо. Насчет диска я даже не знаю, мы арендуем сервер, начинкой я не интересовался. Кэшировать запросы бессмысленно, 95% это INSERT и UPDATE.
Ну при таком раскладе как «95% на INSERT + UPDATE» Вам просто сам Бог велел почаще вспоминать про переход на InnoDB. Мало того, что выиграете в надежности системы, так еще и скорость работы увеличится.
Как вариант — подойдет, но лушче делать не раз в сутки, а чаще, например, раз в час. Запись в критичные таблицы лучше лочить на уровне какого-то адаптера, делать проверку скриптом на поломанность, в случае чего — чинить, а потом открывать лок.
А вообще — стоит хотя бы попробовать найти причину поломки таблиц. Может где-то на форумах найдете описание похожих проблем. Как вариант — попробуйте обновить версию СУБД, может это баг и он уже исправлен.
Раз в час это просто невозможно, есть таблицы с миллионами записей, один CHECK на них выполняется не меньше минуты.
Обновить пока не рискую, ибо если все рухнет, то я поседею. Я не спец в MySQL, просто приходится побочно возиться. На крайний случай оставлю обновление, если больше ничего не поможет.
Логи и свободное место — это фактор, да. Еще советую проверить ограничение в системе на количество открытых файловых дескрипторов. Как посмотреть — зависит от ОС. Для центос: ulimit -n sysctl fs.file-max