02 августа 2017

Попытка починить индекс таблицы в базе MariaDB.



Некоторое время назад начал себя странно вести домашний сервер с TTRSS. То и дело портилась таблица "ttrss_entries", в которой содержатся как раз тела постов из лент. Протокол завален ошибками, клиент новости не подгружает, я в панике. Лечил удалением базы и развертыванием резервной копии.

Восстановление из резервной копии помогает, если поломка произошла уже после её создания ночью, тогда теряются новости только за часть дня. Обновление лент всё потерянное быстро подгружает. Но если крах случился до резервирования, то теряются данные уже минимум за день.

Методом проб и ошибок я выяснил, что портится не сама таблица, а только её индекс, но обновление подписок всё равно не происходит.

Сразу после установки сервера в конфиге я включил опцию "innodb_file_per_table = 1", чтобы каждая таблица хранилась в отдельном. Не факт, но возможно, что она помогла сохранить остальные таблицы.

Перед манипуляциями я перезапустил сервер, чтобы к таблицам был хоть какой-нибудь доступ. Параметр "innodb_force_recovery" в настройки я не добавлял. После этого из терминала запускал следующие команды:

# Исправить таблицы автоматически
mysqlcheck --auto-repair ttrss -u ttrss -p

# ttrss - имя базы данных
# -u ttrss - логин
# -p - запрос пароля

# Оптимизировать таблицу "ttrss_entries"
mysqlcheck -o ttrss ttrss_entries -u ttrss -p

На самом деле оптимизация для таблиц на движке InnoDB не выполняется, а происходит пересоздание самой таблицы. При этом так же пересоздаётся индекс.
ttrss.ttrss_entries
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

После этого сервер какое-то время работает нормально.

Версия сервера:
mysqld Ver 10.1.23-MariaDB-9+deb9u1 for debian-linux-gnu on x86_64 (Debian 9.0)