问题出现得很突然,日志倒是留得挺全。CentOS 7 上的 PostgreSQL 13,pg_dump -Fc 写到 /backup 目录,磁盘只剩 5G 而库有 40G,文件停在 3.8G;恢复时 pg_restore 报 unexpected EOF on file,备份脚本却一直是成功状态。
把日志和配置对完,能解释这个现象的基本就这几处。备份盘容量不够,写到 ENOSPC 时 pg_dump 退出,脚本没检查退出码就继续往下走。另一种情况是-Fc 是压缩自定义格式,截断后文件头完好,只有真正恢复才会暴露。
少数情况下是脚本把 pg_dump 放后台执行,父 shell 不等它也不看 $?。
第一件事是确认备份是否完整
pg_restore -l /backup/db.dump > /dev/null; echo $?
估算库大小与盘余量
psql -c "select pg_size_pretty(pg_database_size('mydb'))"; df -h /backup
随后换成不中断的写法让错误暴露
set -e; pg_dump -Fc -f /backup/db.dump mydb
恢复演练到临时库
createdb t_restore && pg_restore -d t_restore /backup/db.dump
别只看报错消失,验证要多做一步。pg_restore -l 能完整列出 TOC 且条数与上次一致,恢复到临时库后关键表行数与生产相差在千分之一以内,脚本退出码非零时会立刻报警。
容易忽略的是,备份成功不等于能恢复,每周挑一份做恢复演练比看文件大小有用;-Fc 截断时看不出问题,校验一定要用 pg_restore -l。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
