Заметка по горячим следам.
Начал смотреть, чем занято место на сервере. Помимо веб-контента, достаточно много занимали базы 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 с лишним МБ.
А ларчик просто открывался.