2

我一直在努力将 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 卷上,因此我不能真正破坏任何东西并且总是有备份。我在 ubuntu 12 上并排安装了两个数据库。

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

4

1 回答 1

6

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

  1. 确保同时安装了 9.1 和 8.4。Debian 允许这样做,所以大概 ubuntu 也这样做。
  2. 使用 pg_dump 的 9.1 版本,从 8.4 中转储每个数据库,然后为用户提供一个 dumpall 或手动重新创建它们。
  3. 使用 9.1 pg_restore,将您的数据库恢复为用户 postgres 以及 --create 标志。

如果这些步骤中的任何一个存在特定问题,您需要记下它们并提供详细信息。哦 - 详细的分步建议的最佳位置可能是 postgresql-general 邮件列表(有关详细信息,请参阅网站)。你可以在那里慢慢来,把每一步都做好。

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

于 2012-05-22T06:45:54.393 回答