Postgresql 8.4-> 9.1 pg_upgrade失败,因为数据库'template0'存在

时间:2012-05-22 00:12:55

标签: postgresql database-migration postgresql-9.1 postgresql-8.4

我一直在努力将Postgresql数据库从8.4升级到9.1。我遇到过无数问题(可能与Ubuntu的文件放置有关),但我想我看到了终点线。 Pg_upgrade几乎正常工作,但是当它到达第一个数据库'template0'时失败,因为它'已经存在'。

psql:/var/lib/postgresql/pg_upgrade_dump_globals.sql:36: ERROR:  database "template0" already exists

There were problems executing "/usr/lib/postgresql/9.1/bin/psql" --set ON_ERROR_STOP=on --no-psqlrc --port 5432 --username "postgres" -f "/var/lib/postgresql/pg_upgrade_dump_globals.sql" --dbname template1 >> "/dev/null"
Failure, exiting

此template0数据库当然是每个新群集的一部分,无法删除。我尝试在新集群上重命名template0和template1(为了安全)(重新创建它之后),但后续的pg_upgrade调用也失败了,但这次抱怨新集群上不存在template1。

"/usr/lib/postgresql/9.1/bin/pg_ctl" -w -l "/dev/null" -D "/var/lib/postgresql/9.1/main" -o "-p 5432 -b" start >> "/dev/null" 2>&1

connection to database failed: FATAL:  database "template1" does not exist

unable to connect to new postmaster started with the command: "/usr/lib/postgresql/9.1/bin/pg_ctl" -w -l "/dev/null" -D "/var/lib/postgresql/9.1/main" -o "-p 5432 -b" start >> "/dev/null" 2>&1
Failure, exiting

我再次尝试重命名template0并再次失败,但这次是postgres本身的一些断言问题。

executing: SELECT datcollate, datctype FROM     pg_catalog.pg_database WHERE    datname = 'template0' 

pg_upgrade: /build/buildd/postgresql-9.1-9.1.3/build/../contrib/pg_upgrade/check.c:310: set_locale_and_encoding: Assertion `PQntuples(res) == 1' failed.
Aborted (core dumped)

完整性检查注意事项:如果有人认为'只是做一个完整的sql转储并恢复它'也不能正常工作,这就是我试图让pg_upgrade工作的原因。每次升级失败时,我还确保丢弃并重新创建群集,以防止任何遗留的遗物继续使用升级。该数据库位于Amazon Volume上,因此我无法真正破解任何内容并始终拥有备份。我在ubuntu 12上,并安装了两个数据库。

我目前没有涉及进入postgresql源代码的想法,并且非常感谢有关下一步尝试的任何帮助和建议。提前谢谢。

1 个答案:

答案 0 :(得分:6)

停止。喝一杯茶/咖啡,然后坐下。

  1. 确保同时安装了9.1和8.4。 Debian允许这样做,所以大概也是ubuntu。
  2. 使用9.1版本的pg_dump,从8.4转储每个数据库,为用户转储dumpall,或者只是手动重新创建它们。
  3. 使用9.1 pg_restore,将您的数据库恢复为用户postgres以及--create标志。
  4. 如果上述任何步骤存在特定问题,您需要记下这些步骤并提供详细信息。哦 - 详细的逐步建议的最佳位置可能是postgresql-general邮件列表(有关详细信息,请参阅网站)。你可以把时间花在那里,让每一步都正确。

    猜测你是否正在尝试将pg_upgrade放到现有的initdb-ed目录中,而我认为它并不是我所期望的。在任何情况下,dump + restore都是最干净的方法 - 它也为您提供了数据库的备份副本。