如何在PostgreSQL中修复损坏的系统表

时间:2011-05-30 19:29:43

标签: database postgresql corruption

我只是试图在一个相当大的PostgreSQL数据库集群上从版本8.3.0到版本9.0.4进行pg_upgrade。在目标集群上创建新模式之前,一切看起来都会正常工作。由于某种原因,它试图两次创建一个团体角色而死了。

在查看所有脚本之后,很明显它重复了4次组角色。我重新启动了8.3.0数据库,很明显在pg_authid表中重复了一行。

我尝试以单用户模式启动数据库,以尝试REINDEX TABLE pg_authid。尝试使用重复值创建新索引时失败。

我尝试删除违规群组角色。这删除了pg_authid中的4行中的一行,但似乎进一步混淆了事情。

我看到提到在桌面上运行一个完全的真空可能会修复这种腐败,但我没有希望这样做。因此,在数据恢复的同时,我会抓住想法。

2 个答案:

答案 0 :(得分:2)

您是否完全关注pg_upgrade steps?如果是这样,您应该可以使用旧的datadir并在必要时回滚它......对吗? :(

REINDEX TABLE不会解决您的问题,而是

# From old database
pg_dump -t my_problem_table(s) ... > my_screwed_up_data.sql
pg_dump -T my_problem_table(s) ... > my_not_screwed_up_data.sql


# Fix whatever isn't right
${EDITOR} my_screwed_up_data.sql

# In to a fresh database instance
cat my_screwed_up_data.sql | psql
cat my_not_screwed_up_data.sql | psql

可能会让你开始。你可能需要运行第二步和第三步,直到你正确加载东西。希望它只是您的系统目录中有虚假数据。

答案 1 :(得分:1)

您是否考虑过修改pg_upgrade,以便在继续升级之前按照Sean的建议修复错误的语句?我相信在系统表的pg_upgrade中正在进行转储/恢复。