从 Postgres 7.4 升级到 9.4.1

Upgrading from Postgres 7.4 to 9.4.1

我正在将 Postgres 从古老的 7.4 升级到 9.4.1 并发现一些错误。

在旧机器上,我做了:

pg_dumpall | gzip > db_pg_bu.gz

在新机器上,我做了:

 gunzip -c db_pg_bu.gz | psql

在恢复过程中我遇到了一些我不明白的错误,也不知道这些错误的重要性。我不是 DBA,只是一个低级开发人员,所以如果有人能帮助我理解我需要做什么才能完成此迁移,我将不胜感激。

错误如下:

 ERROR:  cannot delete from view "pg_shadow"
 DETAIL:  Views that do not select from a single table or view are not automatically updatable.
 HINT:  To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.

我也得到了其中的大约 15 个:

 NOTICE:  SYSID can no longer be specified

还有这个,虽然这看起来没什么害处,因为我看到 plpgsql 在 9.2 版中默认安装:

 ERROR:  could not access file "/usr/lib/postgresql/lib/plpgsql.so": No such file or directory
 SET
 NOTICE:  using pg_pltemplate information instead of CREATE LANGUAGE parameters
 ERROR:  language "plpgsql" already exists

一个大问题是,当它恢复数据库时,对于每个 ne,我都会看到类似这样的内容:

 COMMENT
 You are now connected to database "landrush" as user "postgres".
 SET
 ERROR:  could not access file "/usr/lib/postgresql/lib/plpgsql.so": No such file or directory

基本上有两种方法。对于没有经验的人来说,两者都很困难。 (甚至对于有经验的人来说)

  • 使用一些中间版本(可能必须从源代码编译)进行逐步迁移。在版本之间你必须做一个 pg_dump --> pg_restore (或者只是 psql < dumpfile,就像问题中一样)。可能的路径第一跳可能是 7.4 -> 8.3,但可能需要额外的一跳。
  • 编辑(未压缩的)转储文件:删除(或注释掉)新版本不喜欢的任何内容。这将是一个迭代过程,它假定您的转储适合您的编辑器。 (并且您知道自己在做什么)。您可能需要重新转储,分离架构和数据(选项 --schema-only 和 --data-only,我什至不知道这些在 PG-7.4 中是否可用)

顺便说一句:建议使用较新版本(您将导入到的版本)中的 pg_dump。您需要通过 -h 标志指定源主机。新(目标)版本知道新版本需要什么,并会尝试适应(到某一点,你仍然需要使用多个步骤)如果它不能产生可用的转储,我也会拒绝工作。 (在这种情况下,您将不得不采取更小的步骤...)

额外:

  • 如果你的失败转换的结果足够完整,如果你只对基础数据感兴趣,你可以就此打住,或许可以稍微润色一下。
  • NOTICE: using pg_pltemplate information instead of CREATE LANGUAGE parameters我不知道这是什么。也许是将其他语言(例如 plpgsql)添加到核心 dbms 的方式。
  • ERROR: language "plpgsql" already exists :您可以忽略此错误。 -->> 注释掉有问题的行。
  • DETAIL: Views that do not select from a single table or view are not automatically updatable. 这意味着旧数据库中使用了 postgres RULE 重写系统。它需要认真的工作才能让它再次工作。