大数据库pg_dump目录格式备份失败:设备无剩余空间排查求助
PostgreSQL 10 目录格式备份失败排查方案
环境与故障概述
环境配置
- 宿主VM:Ubuntu 18.04,32核CPU、256GB内存
- Docker版本:19.06
- PostgreSQL 10:Docker容器部署,容器数据挂载至主机独立2TB磁盘
- 源数据库大小:1.2TB
备份命令
pg_dump -h localhost -p 5432 -U azuredbadmin -j 18 -Fd proddb -f prod-db-backup
故障现象
目录格式备份运行5小时后触发报错:
pg_dump: [directory archiver] could not open output file 'prod-db-backup/blob_36511541.dat': No space left on device pg_dump: [parallel archiver] a worker process died unexpectedly
- 备份目标为4TB磁盘,当前仅占用250GB,剩余3.7TB可用,inode计数正常
- 多次重试均在备份文件夹大小达到605876224字节时失败
- 磁盘监控使用率未达20%,Docker根文件系统(2TB)也未占满
.dump格式备份可成功完成(占用900GB),但恢复耗时过长
可能故障原因
- 临时目录空间不足:并行备份时,pg_dump工作进程会在默认临时目录(通常为
/tmp)生成临时文件,若该目录挂载在空间有限的分区(而非4TB备份磁盘),会触发空间不足报错。 - 备份路径挂载异常:
prod-db-backup所在路径可能未正确挂载到4TB磁盘,实际指向了其他空间不足的分区。 - Docker容器磁盘配额限制:若pg_dump在容器内部执行,容器可能被配置了磁盘配额,导致无法写入更多数据。
- 文件系统限制:4TB磁盘的文件系统可能存在单个文件大小限制,或块大小导致的空间计算误差。
排查与解决方法
1. 检查临时目录空间
- 执行
df -h /tmp查看默认临时目录所在分区的剩余空间 - 若空间不足,可通过以下方式指定临时目录到4TB磁盘:
- 备份命令添加
-T参数:pg_dump -h localhost -p 5432 -U azuredbadmin -j 18 -Fd proddb -f prod-db-backup -T /path/to/4tb-disk/tmp - 或临时修改环境变量后执行备份:
export TMPDIR=/path/to/4tb-disk/tmp pg_dump -h localhost -p 5432 -U azuredbadmin -j 18 -Fd proddb -f prod-db-backup
- 备份命令添加
2. 验证备份路径的实际挂载
- 执行
df -h $(realpath prod-db-backup),确认该路径的挂载点为4TB磁盘 - 若在容器内执行备份,检查容器内的备份路径是否正确映射到宿主的4TB磁盘:
docker inspect <postgres-container-name> | grep -A 10 "Mounts"
3. 检查Docker容器资源限制
- 查看容器是否配置了磁盘配额:
docker inspect <postgres-container-name> | grep -A 5 "StorageOpt" - 确认容器对备份路径的写入权限,以及宿主磁盘未设置用户级配额
4. 检查文件系统属性
- 查看4TB磁盘的文件系统类型:
df -T /path/to/4tb-disk - 查看文件系统的最大文件大小限制:
tune2fs -l /dev/<4tb-disk-device> | grep "Max file size"
5. 小范围测试定位问题
- 减少并行数(如
-j 4)执行目录格式备份,排除并行进程异常 - 尝试仅备份单个大表,确认是否为特定表的备份触发报错:
pg_dump -h localhost -p 5432 -U azuredbadmin -j 4 -Fd proddb -t large_table -f prod-db-single-table-backup
内容的提问来源于stack exchange,提问作者Mahesh Babu
相关产品推荐
相关产品推荐

