PostgreSQL从数据库转储备份恢复单个emp表报错如何解决
报错原因分析
- 所有
pg_restore命令报错「输入文件不是有效归档」的原因:pg_dump默认输出纯SQL文本格式,只有添加-Fc/-Ft/-Fd参数导出的自定义归档、tar、目录格式文件才能用pg_restore工具恢复。你直接用PowerShell重定向符>导出的文件,无论后缀是.sql还是.dump,本质都是普通文本文件,不符合pg_restore的输入要求。 psql执行.sql文件报字符语法错误的原因:PowerShell的>重定向符默认使用UTF-16 LE编码(带BOM头)输出文件,而psql默认按UTF-8编码读取文件,开头的BOM头被识别为乱码字符,导致语法报错。你导出的.dump文件同样是UTF-16编码的文本文件,不是有效归档格式,因此也无法用pg_restore识别。
正确恢复方案
方案1:处理现有备份文件恢复
- 先转码备份文件:用记事本打开
empbackup.sql,选择「另存为」,编码下拉选择「UTF-8」后保存;也可以直接在PowerShell中执行转码命令:Get-Content empbackup.sql -Encoding Unicode | Set-Content empbackup_utf8.sql -Encoding UTF8 - 用
psql执行转码后的文件即可完成恢复:psql -h localhost -p 5432 -U postgres -d postgres -f empbackup_utf8.sql
方案2:重新导出后恢复(操作更简单,兼容性更好)
方式A:纯SQL格式导出恢复
- 导出时直接用
pg_dump的-f参数指定输出文件,不要用PowerShell的>重定向,避免编码问题:pg_dump -h localhost -p 5432 -U postgres -d postgres -t emp -f empbackup.sql - 直接用
psql执行导出的SQL文件:psql -h localhost -p 5432 -U postgres -d postgres -f empbackup.sql
方式B:归档格式导出恢复
- 导出时指定自定义归档格式:
pg_dump -h localhost -p 5432 -U postgres -d postgres -t emp -Fc -f empbackup.dump - 用
pg_restore恢复单表:pg_restore -h localhost -p 5432 -U postgres -d postgres -t emp empbackup.dump
注意:如果目标数据库中已经存在
emp表,恢复前可以先执行DROP TABLE IF EXISTS emp CASCADE;删除旧表,避免重复创建报错;也可以在恢复命令中添加对应忽略错误/覆盖的参数。
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

