我有一个运行PostgreSQL v9.0的(生产)数据库服务器和一个运行PostgreSQL v8.4的开发机器。我想转储生产数据库并在开发机器上使用它。我无法在开发机器上升级postgres。
在生产机器上,我运行:
pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats
在开发机器上,我运行:
pg_restore -d nvdlstats -U nvdladmin nvdls.db
我收到了这个错误:
pg_restore: [archiver] unsupported version (1.12) in file header
无论我在转储时选择自定义,tar还是plain_text格式,都会发生这种情况。
我发现one discussion online表明我应该在开发机器上使用更新版本的pg_restore
。我通过简单地将9.0二进制文件复制到开发机器来尝试这一点,但由于链接问题,这会失败(不会出乎意料)。
我认为使用plain_text转储的意义在于它将是原始的可移植SQL。显然不是。
如何将9.0 DB安装到我的8.4安装中?
答案 0 :(得分:27)
pg_restore仅 用于恢复以“自定义”格式拍摄的转储。
如果执行“纯文本”转储,则必须使用psql运行生成的SQL脚本:
psql -f nvdls.db dbname username
答案 1 :(得分:3)
不支持使用pg_dump / pg_restore从9.0移动到8.4 - 仅支持向前移动。
但是,您通常可以获取数据(在仅数据转储中),并且在某些情况下您可以获取架构 - 但这主要是运气,这取决于您正在使用的功能。
您通常应该使用目标版本的pg_dump和pg_restore - 这意味着您应该使用8.4中的二进制文件。但是你应该使用相同的版本的pg_dump和pg_restore。这两种工具都可以在整个网络中正常工作,因此不需要复制二进制文件。
正如a_horse_with_no_name所说,在明文模式下使用pg_dump可能会更好 - 这将允许您在必要时手动编辑转储。特别是,您可以只使用一个模式转储(使用-s)和仅使用一个数据转储 - 只有模式转储可能需要进行任何编辑。
答案 2 :(得分:2)
如果9.0数据库包含任何bytea列,则会出现更大的问题。
这些列将由pg_dump使用“hex”表示导出,并显示在转储文件中,如:
SELECT pg_catalog.lowrite(0,'\ x0a2')
9.0以下的postgres后端的任何版本都无法识别bytea的十六进制表示,我找不到一个选项来告诉9.0方面的pg_dump不使用它。 pg_dump似乎忽略了为数据库或整个服务器设置默认的“bytea_output”设置为ESCAPE。
我认为可以对转储文件进行后处理,并将每个十六进制编码的bytea值实际更改为转义文件,但存在无法破坏通常存储在bytea中的事物(图像,PDF等)的风险)并没有激动我。
答案 3 :(得分:2)
我通过将postgresql从8.X升级到9.2.4来解决这个问题。如果您在Mac OS-X上使用brew,请使用 -
brew upgrade postgresql
完成此操作后,只需确保您的新postgres安装位于路径的顶部。它看起来像(取决于版本安装路径) -
export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH
答案 4 :(得分:0)
我有同样的问题。我使用pgdump和psql导出/导入DB。
1.设置PGPASSWORD
export PGPASSWORD='h0ld1tn0w';
2.使用pg_dump
导出数据库pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out
/opt/db.out是转储路径。您可以指定自己的。
3.然后再设置另一台主机的PGPASSWORD。如果主机相同或密码相同,则不需要这样做。
4.在您的另一台主机上导入数据库
psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out
如果用户名不同,则在db.out文件中查找并替换您的本地用户名。并确保替换用户名而不是数据。