You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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分区

如果释放空间后仍无法满足需求,需要扩容宿主机对应的磁盘分区:

  1. 先停止容器:
    docker compose down
    
  2. 扩容宿主机磁盘:
    • 若为云服务器,先在云平台控制台扩容对应的云磁盘
    • 根据文件系统类型扩容分区:
      • 针对ext4文件系统:
        resize2fs /dev/sda1
        
      • 针对xfs文件系统:
        xfs_growfs /
        
  3. 重启容器:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:52:40