Discourse 恢复失败,报错关系已存在

由于一系列不幸的事件,我似乎无法从最新的完整备份中恢复。

完整故事稍后公布,但目前我在执行备份恢复时遇到了以下错误:

正在迁移数据库…
异常:rake db:migrate
数据库迁移失败。
rake 终止!
StandardError:发生错误,本次及后续所有迁移均已取消:(StandardError)

PG::DuplicateTable:错误:关系“gamification_leaderboard_scores”已存在

这似乎是我的插件导致的问题,但我希望能得到一些帮助,以便解读日志并找到解决方案,让恢复能够顺利进行。

总之,事情是这样的。

今天早些时候,我执行了一次 Discourse 更新,将其升级到 2026.5.0-latest b0873d3ecd 版本。该更新引入了一些破坏性变更,导致我的 主主题 无法正常工作。我本应在更新前检查兼容性。

在慌乱中,我以为可以从最后一次备份中恢复,以回退到与主题兼容的 Discourse 版本。在恢复之前,我确实做了一个完整备份,心想如果出现问题,尽可能多地保留恢复点总是好的。

然而,在第一次恢复过程中出现了问题,Discourse 重新上线后丢失了最近 15 天的内容。进一步调查后,我找到了一个 Meta 上的主题,其中建议将备份文件从 2026-04-28-033449-v20260420014648.sql.gz 重命名为 2026-04-28-033449-v20260407093145.sql.gz。我不确定为什么这样做有效,但至少让我恢复到了昨天的备份。

我仍然需要恢复今天早上进行的最后一次完整备份,也就是顶部所示报错的那个备份。

这个问题在其他一些插件中也出现过。不知为何,某次迁移创建了该表,但迁移系统并未识别出它已执行。

我目前还无法清晰地解释具体操作步骤。大致来说,你可以在恢复过程中、迁移开始前停止恢复(恢复命令有一个开关可实现此操作),然后删除该表,我想是这样的。如果这听起来合理,或者至少接近正确,或许你可以参考 https://ask.discourse.com/ 寻求帮助来解决问题。

如果上述方法没有帮助,而你时间紧迫且有一定预算,可以在 Marketplace 频道提问或直接发邮件给我。如果你不着急,或者没有预算,仍有可能有人会用你能理解的方式解释具体该怎么做。