我只是试图在一个相当大的PostgreSQL数据库集群上从版本8.3.0到版本9.0.4进行pg_upgrade。在目标集群上创建新模式之前,一切看起来都会正常工作。由于某种原因,它试图两次创建一个团体角色而死了。
在查看所有脚本之后,很明显它重复了4次组角色。我重新启动了8.3.0数据库,很明显在pg_authid
表中重复了一行。
我尝试以单用户模式启动数据库,以尝试REINDEX TABLE pg_authid
。尝试使用重复值创建新索引时失败。
我尝试删除违规群组角色。这删除了pg_authid
中的4行中的一行,但似乎进一步混淆了事情。
我看到提到在桌面上运行一个完全的真空可能会修复这种腐败,但我没有希望这样做。因此,在数据恢复的同时,我会抓住想法。
答案 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中正在进行转储/恢复。