从 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 重写系统。它需要认真的工作才能让它再次工作。
我正在将 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 重写系统。它需要认真的工作才能让它再次工作。