我最近遇到了一个 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"
很明显,393410960
的xmin
值,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
并将其放在其他地方。
可能还有其他解决方案,所以在做更多研究之前不要先做这个。但是,我可以声明这对我有用。
所以为了解决这个问题,我遵循了帖子中给出的建议:
基本上,我所做的是:
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/