Восстановление резервной копии не удалось

У меня возникла следующая проблема. Я веду форум Discourse уже более 10 лет, и поскольку некоторое время не мог устанавливать обновления, я решил настроить новый сервер:

Старый сервер работает на версии: 3.4.0.beta4-dev

Новый сервер: Последняя версия

Размер резервной копии уже составляет 673,2 МБ в формате .gz, без учёта вложений.

К сожалению, процесс восстановления постоянно прерывается. В файле журнала содержится следующая ошибка:

[2026-06-16 07:54:52] ERROR:  could not create unique index «index_incoming_referers_on_path_and_incoming_domain_id»
[2026-06-16 07:54:52] DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.
[2026-06-16 07:54:52] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.

[2026-06-16 07:54:52] /var/www/discourse/lib/backup_restore/database_restorer.rb:93:in 'BackupRestore::DatabaseRestorer#restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in 'BackupRestore::DatabaseRestorer#restore'
/var/www/discourse/lib/backup_restore/restorer.rb:61:in 'BackupRestore::Restorer#run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in 'Object#restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in 'block in '
/var/www/discourse/script/spawn_backup_restore.rb:4:in 'Kernel#fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in ''
[2026-06-16 07:54:52] Trying to rollback...

Что я могу сделать, чтобы исправить эту проблему и не потерять данные за последние 10 лет?

Заранее благодарю за любую помощь!

Привет и приветствуем с возвращением после девяти лет!

Очень круто видеть такой долгоживущий форум.

Думаю, это та же проблема с индексом, о которой говорилось здесь: Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes)

Суть в следующем:

Таблица incoming_referers отслеживает пути URL, по которым посетители попали на ваш форум. У неё есть уникальный индекс, что означает отсутствие двух строк с одинаковой комбинацией пути и домена.

В вашей базе данных есть две строки с path='//' и incoming_domain_id=5. Когда система пытается восстановить этот уникальный индекс во время восстановления резервной копии, она обнаруживает дубликат и прерывает всю транзакцию восстановления.

Так что вам нужно найти и удалить этот дубликат в таблице incoming_referers, а затем создать новую резервную копию для восстановления на новом сервере.

Я нашел эту тему с инструкциями, которая может вам помочь

Большое спасибо за быстрый ответ, я попробую!

(сообщение удалено автором)

Извините, что беспокою, но, кажется, я делаю что-то не так — после выполнения команды «discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;» возникает ошибка синтаксиса.

Вы набрали «discourse=#»? Если да, попробуйте снова без этого.

Затем я получаю сообщение об ошибке «bash: syntax error near unexpected token `from’»

Для справки, я нахожусь в: root@community-app:/var/www/discourse#

Ах, вы ещё не в базе данных.

Сначала выполните psql -U discourse discourse (я думаю)

Затем приглашение командной строки должно измениться на discourse=#

Хорошо, я также установил «apt install postgresql-client-common». Однако ошибка «Error: You must install at least one postgresql-client- package.» всё ещё сохраняется.

Хм, этого я не знаю.

Может быть, попробуйте напрямую через консоль Rails: rails c

с

ActiveRecord::Base.connection.execute(<<~SQL)
  SELECT id, path, incoming_domain_id 
  FROM incoming_referers 
  WHERE path = '//' 
  AND incoming_domain_id = 5
SQL

Это может дать вам тот же результат, не обращаясь к базе данных.

Получилось?

Мне очень, очень стыдно за своё глупое поведение.

Я установил Rails, и, кажется, всё получилось. Я также запустил его через «rails c». Это тоже сработало, но при вводе команды получилось вот так:

“root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: syntax error near unexpected token `<<’
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: команда не найдена
root@community:/var/discourse# FROM incoming_referers
FROM: команда не найдена
root@community:/var/discourse# WHERE path = ‘//’
WHERE: команда не найдена
root@community:/var/discourse# AND incoming_domain_id = 5
AND: команда не найдена
root@community:/var/discourse# SQL”

Не переживайте, возможно, мои инструкции просто не очень хорошие :slight_smile:

Я немного запутался, когда вы сказали, что только что установили Rails и не можете получить доступ к своей базе данных. Может быть, всё иначе из-за старой версии, но, кажется, я тоже уже не знаю, что делать.

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

Даже не уверен, что вы находитесь в самом контейнере. Вы уже выполнили ./launcher enter app?