Database corruption

Материал из [matrix] на Русском
Версия от 06:07, 4 апреля 2023; FLegmatik (обсуждение | вклад) (Новая страница: «Иногда вследствие каких-либо проблем или обновлений у сервера synapse повреждается база данных и в логах появляется ошибка наподобие следующей. RuntimeError: Database corruption: Event $s_Fdun0CtftYMU5YT2m5UfWtrIGfRup059GNNnLpuxA in room !EtibtEWKcLtNgysPVt:matrix.org from the database appears to have been modified (calculated event id $-6mV...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Иногда вследствие каких-либо проблем или обновлений у сервера synapse повреждается база данных и в логах появляется ошибка наподобие следующей.

RuntimeError: Database corruption: Event $s_Fdun0CtftYMU5YT2m5UfWtrIGfRup059GNNnLpuxA in room !EtibtEWKcLtNgysPVt:matrix.org from the database appears to have been modified (calculated event id $-6mVvGaExTh03hb06XS7mfPbE2Vfd4jSv0z84B--w9M)

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

Workaround[править]

Самый простой обходной способ решения проблемы — банально удалить повреждённое событие. Удалять можно, не останавливая сервер: вероятно, этих ошибок будет выявлено несколько десятков, и перезапускать сервер ради каждой нерационально. Сначала сделаем бекап базы данных, остановив сервер. На бекап со сжатием уходит около получаса.

systemctl stop matrix-synapse
time pg_dump -d synapse -h localhost -p 5432 -U matrix-synapse -Z 9 -f backupmatrixdb.sql.0.gz # тут запрашивается пароль пользователя, имеющего доступ к БД
systemctl start matrix-synapse

Потом подключаемся к базе клиентом pgsql и удаляем событие из двух таблиц.

psql -U matrix-synapse -W synapse
synapse=> delete from event_edges where event_id = '$s_Fdun0CtftYMU5YT2m5UfWtrIGfRup059GNNnLpuxA';
DELETE 1
synapse=> delete from events where event_id = '$s_Fdun0CtftYMU5YT2m5UfWtrIGfRup059GNNnLpuxA';
DELETE 1

Вновь смотрим логи матрикс-сервера. Если он жалуется на другое событие, удаляем его. Если жалобы прекратились, выходим из клиента СУБД командой exit и на всякий случай перезапускаем матрикс-сервер.