异常:psql 失败:详细信息:键(post_id)=(36946)重复。

我正在尝试将我的服务器迁移到新的主机,所以我下载了一个备份文件,并将其上传到新主机。安装了 Discourse 的新副本,并按照命令行中的说明进行操作:

不幸的是,discourse restore databasename 命令失败并显示:

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'

看起来数据库文件有问题?有人能指导我如何修复这个错误吗?我仍然可以访问原始服务器,它似乎运行正常。

在下载备份之前,是否有我可以运行的 SQL 命令来分析(并修复?)数据库?

听起来您的索引已损坏。这是哪个版本的 PostgreSQL?

有几个关于此主题的讨论。您可以尝试在正在运行的实例上重新索引该表,然后删除或修复重复的 ID。

是的,我认为它已损坏。如果有人能告诉我如何修复它,我将不胜感激 :slight_smile:

Postgres 是 13.6 版本。我正试图将其移动到另一台服务器上的新实例。

我在 Docker 容器内尝试了 rake search:reindex,但它失败并显示:

........rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "posts_search_pkey"
DETAIL:  Key (post_id)=(86919) already exists.

是否可以删除有问题的记录然后重新索引,或者其他方法?

任何帮助都将不胜感激!

我建议直接删除该行,这是最简单的解决方案

2 个赞

有人能给我一些psql命令来识别和删除有问题的数据行吗?

谢谢,不胜感激!

我认为它类似于

./launcher enter app
su - postges
psql discourse
select id from post_search_data where post_id>86918 and post_id<86921;
--- 获取 ID 时 ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

可能还有更多。

也许其他人可以提供更多帮助,但这可能是我在未登录您的服务器的情况下所能做的全部了。如果您需要更多帮助,可以在 Marketplace 发布帖子或直接联系我。

或者也许直接删除它并让它重新生成是安全的,但我不太确定。

谢谢大家的帮助。

我能够做到以下几点:

discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew2"
DETAIL:  Key (post_id)=(116038) is duplicated.
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 2
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 0
discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew3"
DETAIL:  Key (post_id)=(9336) is duplicated.
discourse=# delete from post_search_data
where post_id = 9336;
DELETE 1
.
.
.
.
discourse=# reindex index concurrently "posts_search_pkey";
REINDEX

一切看起来都正常后,我进行了完整备份并将其恢复到一个新服务器上,没有出现任何问题。

感谢大家的时间。我爱 discourse!

经验教训:偶尔检查一下备份,确保它们是好的 :slight_smile: 我保留每日备份,另外还保留每月“快照”。我拥有的最早的没有损坏数据库的备份是 4 个月前的 :frowning:

5 个赞

太好了!很高兴你解决了!

@sam 令人不安的是,我以为这是PG<13版本的问题,但你运行的是PG13。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.