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

我在一台机器上使用了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 。 事实上,该文件是空的,因为安装没有正确执行。