我在一台机器上使用了pg_dump,并将结果文件复制到另一台机器上,我试图恢复它。 我相信架构是一样的。 但是,我得到:
pg_restore: [archiver] input file does not appear to be a valid archive
我做了以下操作:
pg_dump -a -f db.txt dbname
和:
pg_restore -a -d dbname db.txt
什么可能是错的?
你正在倾倒在纯粹的SQL格式,这是devise为饲料psql。 这不被pg_restore识别。
cat db.txt | psql dbname
应该做的伎俩
默认情况下, pg_dump
会创build重新创build数据所需的sql命令。 为了恢复它,你只需要调用psql
(而不是pg_restore
)和文件作为input。 pg_restore
只能用于pg_restore
的二进制(不是默认的,不常用的不推荐 )格式。 阅读文档 。
更新:与pg_restore
一起使用的pg_dump
二进制格式( -Fc
-Ft
)可以,并提供一些额外的灵活性。 但是他们不那么标准(非SQL),不适合从某些工具(例如php前端)导入或者使用文本编辑器进行操作,并且对于其他版本甚至其他数据库来说可移植性稍差。 对于备份,我会坚持使用默认的纯文本格式。 对于其他情况,二进制+ pg_restore选项可以相同或更适合。
需要注意的是,在Postgresql中,在典型的情况下 ,通常通过pg_dump (plain)完成备份,而使用标准命令行客户端( psql )进行恢复。
尝试将--format=c
选项传递给pg_dump
。 这将允许pg_restore
恢复它。
这是我会做备份我的旧数据库和恢复
备份你的数据库
pg_dump --format=c olddb_name > db_dump_file.dump
要恢复该备份
pg_restore -v -d newdb_name db_dump_file.dump
阅读关于pg_dump和pg_restore的更多信息
对于Windows用户尝试
type db.txt | psql --username="YOURNAME" dbname
奇迹般有效
你可以对MySQL的SOURCE
命令做些什么:
psql dbname
然后,在postgresqlterminal:
\i filename
cat dumpFileName | psql -h ip -d dbName -U userName -W
这个错误信息也可能意味着备份文件实际上有些问题(或者你的假设)。
在一个案例中,我已经在Docker容器中挂载了一个备份文件,并试图恢复,但失败does not appear to be a valid archive
。 事实上,该文件是空的,因为安装没有正确执行。