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

Привет,

Я пытаюсь восстановить резервную копию на новый экземпляр Discourse в рамках миграции сервера. К сожалению, я получаю эту ошибку:

Я ознакомился с этим:

Restore fails - could not create unique index - #2 by simon и удалил индексы.

Теперь, когда я выполняю:

[2] pry(main)> IncomingReferer.where(path: "/m/search")
=> []

я не получаю результатов.

Теперь можно делать резервную копию и восстанавливать её на другом сервере?

Спасибо,

Сэм

К сожалению, это не помогло, и при восстановлении я всё ещё получаю это сообщение:

[2021-07-03 16:53:41] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 16:53:41] DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.
[2021-07-03 16:53:41] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.

Мне не совсем понятно, как это исправить.

Я нашёл ещё несколько дубликатов с помощью IncomingReferer.where("path LIKE '%/m/search%'"), поэтому также удалил их. Теперь мой экземпляр вообще не работает — даже на старом сервере, поэтому я попробую восстановить его заново.

Сэм

Что-то всё ещё не так. Я получаю:

[2021-07-03 17:28:53] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 17:28:53] DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.
[2021-07-03 17:28:53] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.

при попытке восстановить новую резервную копию.
Но в консоли видно, что я очистил экземпляры на работающем сервере (который после пересборки снова в строю):

[1] pry(main)> IncomingReferer.where(path: "/m/search")
=> []
[2] pry(main)> IncomingReferer.where("path LIKE '%/m/search%'")
=> []

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

Спасибо,

Сэм

Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes) может дать некоторые подсказки.

Спасибо.

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

Сэм

По сути, вам нужно попытаться восстановить индекс и продолжать удалять записи, пока не сможете выполнить реиндексацию. Похоже, вы делаете всё правильно, просто нужно повторять это для всех дубликатов.

Если у вас есть бюджет, вы можете написать в Marketplace.

Привет, Джей,

В Великобритании незаконно передавать нашу базу данных третьим лицам для решения этих проблем, и даже если бы это было разрешено, я не заинтересован в этом, так как приоритетом для меня является защита конфиденциальности пользователей.

Как сам являюсь разработчиком с открытым исходным кодом, идея обратиться к Marketplace меня разочаровывает, особенно учитывая, что, похоже, есть молчаливое признание того, что проблемы возникли из-за обновления Postgres, которое Discourse включил в свой Docker-контейнер. Мы используем Discourse в Docker-контейнере, поскольку понимаем тесную взаимосвязь зависимостей и хотим делегировать управление версиями и зависимостями экспертам команды Discourse.

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

Я предпочёл бы профинансировать время разработки для исправления этой проблемы в основной ветке Discourse, чтобы другие также могли воспользоваться этим исправлением. Временно наш форум не функционирует, и мне потребуется консультация специалиста с опытом администрирования баз данных Postgres.

С уважением,

Сэм

Привет, Сэм.

Извини, что не смог дать тебе достаточно инструкций, чтобы ты сам решил свою проблему, но именно так это и прозвучало. Я думал, что ты скорее обрадуешься, чем расстроишься, узнав, что есть другие способы вернуть свой форум в строй.

С наилучшими пожеланиями

Привет, Джей

Нисколько. Ты мне ничего не должен — но я надеялся, что у тебя есть быстрое решение, учитывая твою историю постов, и предположил, что упустил что-то очевидное, так как твои посты казались исчерпывающим ответом, а тема была закрыта.

Я сообщу, как у меня получится.

С уважением,

Сэм

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

Мы готовы оплатить решение этой проблемы, но после возникновения данного инцидента и многократного признания его существования на форуме без четкого решения мы серьезно рассматриваем возможность перехода на другое программное обеспечение для форумов, например Flarum. Оно может быть менее функциональным, чем Discourse, но работает на стеке LAMP, и я (как не веб-разработчик) смогу разобраться в его работе.

Когда мы использовали Docker-контейнер Discourse, мы ожидали, что получим поддержку. Если бы мы развернули все компоненты отдельно и использовали собственную версию Postgres, я бы мог понять такой ответ. Но на данный момент мы использовали только ту среду, которую вы рекомендовали и поставляли, и теперь у нас возникли серьезные проблемы с переездом на новый сервер (у нас близится дедлайн).

На данный момент лучшим вариантом для меня является резервное копирование и восстановление томов Docker, поскольку резервные копии Discourse не работают. Это также тревожит: у нас есть ежедневные резервные копии, но их невозможно восстановить в новую среду Discourse. Интересно, сколько других пользователей столкнутся с подобной проблемой в ближайшем будущем.

Сэм

Действительно, в Postgres было довольно много ошибок, приводивших к повреждению индексов. Мы считаем, что большинство из них исправлено в версиях Postgres 13.x.