Docker容器中PostgreSQL 15数据库磁盘扩容及故障排查
问题解决方案
一、停止/重启容器是否会丢失数据?
不会丢失数据。你的PostgreSQL核心数据存储在Docker命名卷postgres_data中,Docker卷的生命周期独立于容器,容器停止、删除操作都不会影响卷内的存储数据,重启容器后会自动挂载该卷读取原有数据。
二、解决overlay分区100%占用的问题
分区满是导致PostgreSQL进入恢复模式的直接原因(PostgreSQL运行需要空间写入WAL日志、临时文件等,磁盘耗尽会触发故障保护进入恢复状态),以下是分步解决方法:
2.1 紧急释放空间
(1)容器内临时清理
进入容器后执行以下操作释放空间:
- 清理系统临时文件:
rm -rf /tmp/* - 清理PostgreSQL旧日志(如果可访问):
rm -rf /var/log/postgresql/*.log.old - 检查挂载的迁移目录
/usr/src/app/migrations:如果存在大的备份文件或无用脚本,确认本地有副本后可临时删除(注意:该目录挂载自宿主机./data,删除操作会同步影响宿主机文件)
(2)宿主机层面清理Docker资源
容器内的overlay分区对应宿主机的Docker存储目录(通常为/var/lib/docker/),在宿主机执行以下命令清理无用资源:
- 删除已停止的容器:
docker container prune -f - 删除未使用的镜像(包括悬空镜像):
docker image prune -a -f - 删除未使用的卷(注意:执行前用
docker volume ls确认postgres_data卷存在,避免误删):docker volume prune -f - 清理Docker构建缓存:
docker builder prune -f
2.2 扩容overlay分区
如果释放空间后仍无法满足需求,需要扩容宿主机对应的磁盘分区:
- 先停止容器:
docker compose down - 扩容宿主机磁盘:
- 若为云服务器,先在云平台控制台扩容对应的云磁盘
- 根据文件系统类型扩容分区:
- 针对ext4文件系统:
resize2fs /dev/sda1 - 针对xfs文件系统:
xfs_growfs /
- 针对ext4文件系统:
- 重启容器:
docker compose up -d
三、恢复PostgreSQL正常运行
空间释放或扩容完成后,重启容器:
docker compose restart db
随后尝试连接数据库:
docker compose exec db psql -U postgres -d postgres
若仍处于恢复模式,可通过容器日志查看恢复进度:
docker compose logs db
内容的提问来源于stack exchange,提问作者bartaelterman
相关产品推荐
相关产品推荐

