Заметка: «corrupted index» в MySQL при optimize table

Заметка по горячим следам.

Начал смотреть, чем занято место на сервере. Помимо веб-контента, достаточно много занимали базы ejabberd’а — порядка 1 ГБ для jabberworld. Половина объема — archive (таблица для хранения сообщений). Держа в голове мысль о том, что архив на деле может быть меньше — ведь в cron’е теперь идет его периодическая чистка — я поискал команды для возможности уменьшения занимаемого таблицей места на диске. Для этого есть

optimize table archive;

На что получил несколько сообщений:

| Table does not support optimize, doing recreate + analyze instead

| Index for table 'archive' is corrupt; try to repair it

| Operation failed

«Наверное, битый индекс тянется еще с каких-то старых времен» — подумал я. Начал искать решения.

Для таблицы, кстати, было с десяток индексов — можно глянуть по show indexes from archive.

repair table archive выдал в ответ The storage engine for the table doesn't support repair.

check table archive и analyze table archive выдавал OK в статусе.

alter table archive engine = InnoDB тоже выдавал ошибку индексов.

Найденный в сети вариант reindex table archive у меня не работал — ошибка синтаксиса.

Оставалось полное пересоздание таблицы. Решил потренироваться «на кошках» — создать сначала просто копию таблицы. Открыл для себя несколько новых команд:

create table archive2 like archive

insert into archive2 select * from archive ;
ERROR 3 (HY000): Error writing file '/tmp/#sql/fd=524' (Errcode: 28 "No space left on device")

А вот это уже интересно. Сходу в соседней консоли глянул сначала место по обычным дискам, но там все ок. Вчитался. /tmp. Он в tmpfs и (был) 256 МБ. Перемонтировал, увеличив место. Копия таблицы успешно создалась. Не тут ли проблема и с индексами? А точнее — с ее отсутствием вообще? Запустил снова optimize table archive — в этот раз все прошло без ошибок. В процессе наблюдал занимаемое место в /tmp — до 400 с лишним МБ.

А ларчик просто открывался.

Добавить комментарий