Database corruption
Иногда вследствие каких-либо проблем или обновлений у сервера 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 и на всякий случай перезапускаем матрикс-сервер.