Восстановление из резервной копии не удаётся: ошибка создания индекса postgres

Всем привет,

Я уже несколько лет без проблем использую Discourse.

Сегодня я попытался выполнить обновление через веб-интерфейс с версии 2.4.0beta-something, на которой я работал, до текущей (2.5.0beta5). Это… прошло не очень хорошо. Я не сделал хороших заметок, но, похоже, PostgreSQL не запустился корректно из-за того, что каталог данных PostgreSQL не принадлежал правильному пользователю.

Я подумал, что попробую клонировать мои старые контейнеры/app.yml в app2 и восстановить систему из резервной копии. Новый контейнер был собран, и я следовал инструкциям по запуску резервного копирования через командную строку (Restore a backup from the command line - #12). Команда “discourse restore ” завершается ошибкой:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Trying to rollback...
Rolling back...
Cleaning stuff up...

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

Спасибо!
–dustin

Добро пожаловать, Дастин. Извините, что у вас возникли проблемы.

У вас поврежден индекс. Посмотрите это: PostgreSQL 12 update - #238.

Спасибо за ваш ответ. В конце концов, вместо того чтобы пытаться создать новое приложение и восстановить его из резервной копии, я вернулся к своему исходному приложению и несколько раз выполнил команду ‘./launcher rebuild app’ (от имени root, чего я не ожидал, но, вероятно, это имело смысл, так как изначально я настраивал свой сайт от имени root), и теперь мой сайт снова работает! Ура!

Напомните мне никогда не нажимать на кнопку «Обновить», которая выглядит так дружелюбно!

спасибо,
–dustin

У вас всё ещё повреждённый индекс. Вы всё ещё хотите, чтобы он не был повреждён.

Вау, было бы очень здорово, если бы процесс обновления мог исправить некоторые из этих проблем!

Итак, после установки плагина Data Explorer и изучения индекса incoming_referers, а также удаления других индексов, перечисленных в запросе здесь:

Но я всё ещё получаю:

discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew1" concurrently, skipping

И они не хотят удаляться!

# drop index pg_toast_19337_index_ccnew1;
ERROR:  index "pg_toast_19337_index_ccnew1" does not exist

Ага, нужен префикс pg_toast:

discourse=# drop index pg_toast.pg_toast_19337_index_ccnew1;
DROP INDEX
discourse=# drop index pg_toast.pg_toast_19337_index_ccnew;
DROP INDEX
discourse=# REINDEX SCHEMA CONCURRENTLY public;
REINDEX

Да, повреждённые индексы — это то, на что мы внимательно смотрим, приносим извинения за возникшие трудности. Теоретически это не должно быть возможно, но, как говорится, теория и практика — разные вещи. Я надеюсь, что PG12 будет более устойчив к тому, что бы это ни было.

Рад это слышать. Это, по сути, первая проблема, с которой я столкнулся после лет беспроблемного использования — настолько, что я часто даже забываю, на какой машине она запущена.Спасибо,–Дастин