使用pg_dump只能使用compress参数进行备份损坏?

问题描述 投票:4回答:4

我使用此命令备份200GB数据库(postgres 9.1,win7 x64):

pg_dump -Z 1 db_name > backup

它创建了16GB的文件,我觉得很好,因为以前的备份工作(并且由ext工具打包)具有相似的大小。现在,当我尝试使用pg_restore恢复到PG9.2时,我收到错误:

input file does not appear to be a valid archive

使用pg_restore -Ft

[tar archiver] corrupt tar header found in ▼ (expected 13500752, com
puted 78268) file position 512

Gzip也表明它已经损坏了。当我在Total Commander中打开备份文件时,内部文件只有1.8GB。当我在寻找解决方案时,可能应该使用-Cf参数进行转储。

现在哪种格式的文件?它只是tar或gzip(winrar显示gzip)?有没有办法正确地恢复它或者它以某种方式被破坏(转储时没有错误)?可能是由于tar或gzip的文件大小限制?

postgresql backup restore pg pg-dump
4个回答
6
投票

你在“备份”中输出的只是压缩普通的sql。你可以通过提示检查它:

gzip -l backup

不幸的是,pg_retore没有提供恢复PLAIN SQL的可能性,所以你只需要解压缩文件并使用psql -f <FILE>命令:

zcat backup > backup.sql
psql -f backup.sql

根据“Frank Heikens”的建议,不可能使用postgres 9.1中的pg_dump -Fc进行转储,因为转储格式在主要版本之间不兼容,如9.0 - > 9.1 - > 9.2,而“pg_restore”会在9.2上给出错误


0
投票

您的转储是纯SQL,它不是tar格式,就像您尝试在pg_restore中使用一样。如果需要压缩格式,请使用--format = custom或-Fc,并在pg_restore中使用此设置。检查manual


0
投票

这是一个旧线程虽然我有完全相同的问题,并设法用fixgz修复有点损坏的转储:

简短的回答:在压缩转储上运行fixgz http://www.gzip.org/fixgz.zip

fixgz.exe bad.gz fixed.gz

答案很长:所以如果你使用pg_dump和--compresss或-Z而不指定自定义格式选项(-Fc),你实际得到的是ASCII模式而不是BINARY模式的压缩文件。

引自http://www.gzip.org/#faq1

如果您已在ASCII模式下传输文件而您无法再访问原始文件,则可以尝试使用程序fixgz删除传输所插入的额外CR(回车)字节。 Windows 9x / NT / 2000 / ME / XP二进制文件就在这里。但绝对不能保证这将实际修复您的文件。结论:从不以ASCII模式传输二进制文件。


0
投票

大多数情况下,此错误表示您的还原操作使用了无效格式

从pg_dump手册(pg_dump --help)

-F, --format=c|d|t|p         output file format (custom, directory, tar,  
                             plain text (default))

这意味着如果使用pg_dump创建转储而没有选项--format / -F,则转储将以纯文本格式创建

注意:使用pg_restore工具无法恢复纯文本格式。请改用psql <dump.sql。

例子:

# plain text export/import
pg_dump -Fp -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql
psql -d postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> -f dump.sql

# custom format 
pg_dump -Fc -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql.custom
pg_restore -Ft postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> dump.sql.custom

# tar format 
pg_dump -Ft -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql.tar
pg_restore -Ft postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> dump.sql.tar

还原格式与备份不匹配时,也可能发生主题错误。 例如,创建的转储将采用自定义格式,但用于恢复指定的tar

© www.soinside.com 2019 - 2024. All rights reserved.