Заметка: “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 с лишним МБ.

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

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