pg_dump 和 pg_restore:输入文件似乎不是有效的存档

gru*_*czy 81 postgresql

我在一台机器上使用了 pg_dump 并将结果文件复制到另一台机器上,在那里我试图恢复它。我相信架构是一样的。但是,我得到:

pg_restore: [archiver] input file does not appear to be a valid archive
Run Code Online (Sandbox Code Playgroud)

我做了以下操作:

pg_dump -a -f db.txt dbname
Run Code Online (Sandbox Code Playgroud)

和:

pg_restore -a -d dbname db.txt
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?

小智 104

您正在以纯 SQL 格式转储,该格式旨在提供给psql. 这不被pg_restore.

cat db.txt | psql dbname
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩

  • 或`psql dbname < db.txt` ;) (13认同)

leo*_*loy 31

pg_dump默认情况下,会创建重新创建数据所需的 sql 命令。要恢复它,您只需要调用psql(not pg_restore) 文件作为 input 。pg_restore仅用于二进制(未默认值,并且通常较少不推荐)的格式pg_dump。阅读文档

更新:要使用的pg_dump二进制格式 ( -Fc -Ft) 没问题pg_restore,并提供了一些额外的灵活性。但是它们不太标准(非 SQL),不太适合从某些工具(例如 php 前端)导入或使用文本编辑器进行操作,并且对其他版本甚至其他数据库的可移植性稍差。对于备份,我会坚持使用默认的纯格式。对于其他场景,binary + pg_restore 选项可以同样或更贴切。

需要注意的一点是,在 Postgresql 中,在典型场景中,备份通常由pg_dump (plain)完成,并使用标准命令行客户端 ( psql )进行还原。

  • [OT] 我不同意自定义输出格式的“不推荐”状态 - 手册中的句子“这是最灵活的格式,因为它允许重新排序加载数据以及对象定义......”似乎对我来说是一种认可。 (2认同)

psm*_*ars 15

尝试将--format=c选项传递给pg_dump. 这将允许pg_restore恢复它。

  • 抱歉,复制粘贴错误的输出,正确的是`pg_restore: [archiver] 在文件头中没有找到魔法字符串` 所以这不适用于简单的 sql 转储 (2认同)

Tec*_*hie 9

这就是我要备份旧数据库并恢复的方法

备份您的数据库

pg_dump --format=c olddb_name > db_dump_file.dump
Run Code Online (Sandbox Code Playgroud)

恢复该备份

pg_restore -v -d newdb_name db_dump_file.dump
Run Code Online (Sandbox Code Playgroud)

阅读有关pg_dumppg_restore 的更多信息


小智 5

对于 Windows 用户,请尝试

type db.txt | psql --username="YOURNAME" dbname
Run Code Online (Sandbox Code Playgroud)

奇迹般有效