Docker Compose部署的MySQL数据库不时被删除,求排查解决方法
问题排查与解决方案
可能的原因及对应解决办法
1. 命名卷被意外删除
Docker命名卷dbdata如果被手动执行docker volume rm、定时清理脚本误删,会直接导致MySQL数据完全丢失。开发服务器可能存在CI/CD流程、服务器维护脚本这类自动清理Docker资源的操作,容易误删指定卷。
- 检查服务器定时任务(执行
crontab -l),若有docker volume prune这类清理命令,修改为排除dbdata:docker volume prune --filter "name!=dbdata" - 通过
docker events实时监控卷的创建/删除事件,或查看Docker daemon日志(通常路径/var/log/docker.log),定位删除操作触发源。
2. MySQL容器启动环境变量异常
如果开发服务器上的${DB_DATABASE}等环境变量为空或被篡改,MySQL容器重启时不会自动创建指定数据库;若卷数据因损坏无法识别,MySQL会直接初始化新环境,表现为原有数据库消失。
- 验证服务器环境变量配置:
确保变量值正确且非空。echo $DB_DATABASE $DB_USERNAME $DB_PASSWORD - 给MySQL容器添加日志配置,追踪初始化过程:
修改db服务的docker-compose.yml配置:
启动后查看db: image: mysql:5.7 # ...保留原有配置 command: ["mysqld", "--general-log=1", "--general-log-file=/var/log/mysql/general.log"] volumes: - dbdata:/var/lib/mysql - ./mysql-logs:/var/log/mysql # 挂载日志到宿主机方便查看./mysql-logs/general.log,排查是否有数据库删除语句或初始化异常信息。
3. PHP应用代码误操作
本地与开发服务器的代码分支、配置可能不一致,应用中存在的重置脚本、测试用例等逻辑,在服务器环境被触发后可能误删数据库。
- 检查应用代码中是否存在
DROP DATABASE相关语句,重点排查初始化、数据库迁移脚本; - 查看PHP容器日志:
docker logs farmers-app,排查是否有执行删除操作的记录或报错; - 启用MySQL查询日志(参考第2点配置),追踪发起删除操作的来源。
4. Docker Compose命令执行错误
在开发服务器上执行docker-compose down -v会删除所有关联卷,包括dbdata,直接清空数据。
- 提醒团队成员,服务器上执行Docker Compose命令时避免使用
-v参数:# 错误操作:会删除卷 docker-compose down -v # 正确操作:仅停止容器,保留卷数据 docker-compose down - 更新服务时直接用
docker-compose up -d,无需先down再up,除非明确要清理卷数据。
5. 服务器磁盘故障
开发服务器磁盘空间不足、IO错误,可能导致MySQL数据卷损坏,MySQL启动时无法识别原有数据,进而重新初始化环境。
- 检查服务器磁盘空间:
df -h - 查看系统日志
/var/log/syslog或/var/log/messages,排查是否有磁盘相关报错; - 尝试备份并恢复卷数据:
# 备份现有卷数据 docker run --rm -v dbdata:/data -v $(pwd):/backup ubuntu tar cvf /backup/dbdata.tar /data # 删除旧容器与卷 docker-compose down -v # 重新启动数据库容器 docker-compose up -d db # 恢复备份数据 docker run --rm -v dbdata:/data -v $(pwd):/backup ubuntu tar xvf /backup/dbdata.tar -C / --strip-components=1
内容的提问来源于stack exchange,提问作者riki-tik
相关产品推荐
相关产品推荐

