postgresql - Postgres 损坏错误 : Duplicate rows with the same primary key

标签 postgresql duplicates corrupt

我最近遇到了一个 Postgres 错误(我的数据库损坏),基本上,数据库中的某些行重复了(连同主键)。在我继续之前,这些是这篇文章中解决的错误:

ERROR:  uncommitted xmin 393410960 from before xid cutoff 393413059 needs to be frozen

ERROR:  failed to find parent tuple for heap-only tuple at (3,8) in table "your_table"

很明显,393410960xmin值,393413059的cut-off值和ctid(3,8) 在您的情况下可能会有所不同。


我是如何得到这些错误的:

如果你想得到这些错误(并且你遇到了这个问题),你可以通过以下方式找到它们:

your_db=# VACUUM FULL your_table;
ERROR:  uncommitted xmin 393410960 from before xid cutoff 393413059 needs to be frozen

得到第二个错误:

your_db=# REINDEX TABLE your_table;
ERROR:  failed to find parent tuple for heap-only tuple at (3,8) in table "your_table"

不要 panic !下面给出了解决方案:)

最佳答案

在阅读本文之前,请注意我对数据丢失或损坏或由此引起的任何问题不承担任何责任!

我建议您备份所有内容!但是不要做 pgdump,做一个完整的文件系统备份。使用 rsync 并将其放在其他地方。

可能还有其他解决方案,所以在做更多研究之前不要先做这个。但是,我可以声明这对我有用。


所以为了解决这个问题,我遵循了帖子中给出的建议:

http://www.postgresql-archive.org/BUG-10189-Limit-in-9-3-4-no-longer-works-when-ordering-using-a-composite-multi-type-index-td5802079.html

基本上,我所做的是:

your_db=# BEGIN;
BEGIN
your_db=# DELETE FROM your_table WHERE ctid='(3,8)';
DELETE 1
your_db=# END;
COMMIT
your_db=# VACUUM FULL your_table;
VACUUM
your_db=# REINDEX TABLE your_table;
REINDEX

只有以 your_db=# 开头的行是我写的。所以你可以看到我删除了有问题的行然后运行了重新索引。如果失败,您将删除下一个有问题的行并重新编制索引,直到成功为止。

希望这对您有所帮助。

关于postgresql - Postgres 损坏错误 : Duplicate rows with the same primary key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50354521/

相关文章:

image - 使用 avconv => corrupted video 从 jpeg 创建视频

java - Apache FTPClient 上传 jar 文件最终被损坏

php readfile() 和 fopen() 损坏/损坏下载

java - 具有基于仲裁的同步复制的 JDBC Postgres 故障转移

sql - 具有缺失值的数据的 Json 聚合

android - 如何确保解析数组时不会返回重复的 JSON 数据?

java - 删除 ArrayList 中的重复数组?

java - 如何通过 DataAccessException 检索 postgres 数据库上的 SQL 错误代码?

postgresql - 通过不同的名称关联同一个模型两次

php - 更新列值或删除重复的列值?