还原失败:无法创建唯一索引

您好,

我正在尝试将备份恢复到新的 Discourse 实例,因为我正在进行服务器迁移。不幸的是,我遇到了以下错误:

我已经阅读了以下内容:

Restore fails - could not create unique index - #2 by simon 并删除了索引。

现在,当我执行:

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

我没有得到任何结果。

现在是否可以进行备份并在另一台服务器上恢复?

谢谢,

Sam

不幸的是,这并没有解决问题,我在恢复时仍然收到此消息:

[2021-07-03 16:53:41] ERROR: 无法创建唯一索引 "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 16:53:41] DETAIL: 键 (path, incoming_domain_id)=(/search, 4502) 重复。
[2021-07-03 16:53:41] EXCEPTION: psql 失败:DETAIL: 键 (path, incoming_domain_id)=(/search, 4502) 重复。

目前还不清楚如何修复此问题。

我发现了更多重复项,使用了 IncomingReferer.where("path LIKE '%/m/search%'"),因此也销毁了这些索引。我的实例现在似乎完全无法运行——即使在旧服务器上也是如此,因此我将尝试重新构建它。

Sam

仍有问题。我遇到了以下错误:

[2021-07-03 17:28:53] ERROR:  无法创建唯一索引 "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 17:28:53] DETAIL:  键 (path, incoming_domain_id)=(/osmc/osmc, 2939) 重复。
[2021-07-03 17:28:53] EXCEPTION: psql 执行失败:DETAIL:  键 (path, incoming_domain_id)=(/osmc/osmc, 2939) 重复。

在尝试恢复新备份时出现此问题。

但我的控制台显示,我已经清理了运行中服务器上的实例(该服务器重建后现已恢复运行):

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

请问有谁能建议需要做什么来修复数据库,以便我能在另一台机器上恢复它?

谢谢

Sam

Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes) 可能提供一些线索。

谢谢。

我已经读过这篇文章,但不知道需要运行哪些命令或查询来解决我的问题。

Sam

基本上,你需要尝试重建索引,并持续删除内容,直到能够重新索引为止。看起来你已经在做正确的事情,只需对所有重复条目持续进行此操作即可。

如果你有预算,可以在 Marketplace 中发帖。

你好 Jay,

在英国,将我们的数据库暴露给第三方以修复这些问题是违法的;即使合法,出于保护用户隐私的考虑,我也无意这样做。

作为一名开源项目的维护者,将此事提交至 Marketplace 的做法令人失望,尤其是这似乎默认了问题是由 Discourse 在其 Docker 容器中捆绑的 Postgres 更新所引入的。我们使用 Discourse 的 Docker 容器,是因为我们理解其中紧密耦合的依赖关系,并希望将版本和依赖管理交由 Discourse 团队的专业能力来处理。

目前看来,这已被普遍认为是 Postgres 12 的一个回归问题,并且存在一些可能的缓解措施。然而,相关报告早在一年多前就已出现,我确信未来会有更多用户在尝试恢复备份时受到影响。

我宁愿资助一些开发时间,以便在 Discourse 上游修复此问题,让其他人也能从中受益。在此期间,我们的论坛无法正常运行,我将需要向具备 Postgres DBA 知识的专业人士寻求帮助。

祝好,

Sam

1 个赞

嘿,Sam。

很抱歉,我没能提供足够的指导让你自行解决问题,但你的语气听起来像是这样。我以为得知还有其他方法能让你的论坛重新上线,你会感到宽慰,而不是失望。

祝好!

1 个赞

你好,Jay:

完全不是这样。你不必对我有任何亏欠——但我原本以为,鉴于你的发帖历史,你应该能提供一个快速的解决方案。而且,由于你的帖子看起来像是 definitive 的答案,且该话题已关闭,我本以为自己漏掉了什么显而易见的内容。

我会随时告知你进展。

祝好,

Sam

1 个赞

不幸的是,这仍然是我们面临的问题,而且我们无法迁移服务器,这令人相当担忧。

我们很乐意付费请人解决此问题,但在此问题出现后,尽管论坛中多次承认该问题却仍未提供明确的解决方案,我们正认真考虑迁移到其他论坛软件,例如 Flarum。它可能不像 Discourse 那样功能丰富,但它基于 LAMP 架构,而我(作为非 Web 开发人员)也能轻松上手。

当我们使用 Discourse 的 Docker 容器时,我们期望能获得支持。如果我们自行部署所有组件并使用自己的 Postgres 版本,我或许能理解目前的回应。但到目前为止,我们仅使用了你们推荐并提供的运行环境,而现在在迁移到新服务器方面我们陷入了困境(我们有一个迫在眉睫的截止日期)。

目前,我最好的办法是进行 Docker 卷备份和恢复,因为 Discourse 的备份功能无法使用。这也令人担忧:我们每天都有备份生成,却无法将其恢复到新的 Discourse 环境中。我想知道近期会有多少人遇到类似的问题。

Sam

Postgres 确实存在一些会导致索引损坏的 bug。我们认为其中大部分已在 Postgres 13.x 中得到解决。