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

Docker重启后MySQL数据库丢失问题排查求助

验证MySQL容器数据实际存储位置的步骤

根据你的描述,虽然挂载了/var/lib/mysql卷,但数据似乎没写入这个路径,大概率是MySQL运行时实际使用的datadir和你配置的不一致,或者配置文件没生效。下面是一步步的验证方法:

1. 直接查询MySQL运行时的实际datadir

这是最准确的方式,能直接告诉你MySQL当前正在使用的数据目录:

  • 先进入容器的bash终端:
    docker exec -it mysql bash
    
  • 登录MySQL(输入你设置的密码secret):
    mysql -uroot -psecret
    
  • 在MySQL命令行执行查询:
    SHOW VARIABLES LIKE 'datadir';
    
    这个结果会直接显示MySQL的实际数据存储路径,如果返回的不是/var/lib/mysql,那问题根源就找到了。

2. 检查MySQL启动日志,确认配置加载情况

有时候配置文件可能没被正确加载,或者启动参数覆盖了配置:

  • 查看容器的启动日志:
    docker logs mysql
    
    找包含datadir的行,或者类似Reading configuration from的日志,确认MySQL是否加载了你挂载的mysql.conf.d/mysqld.cnf,以及里面的datadir设置是否生效。比如如果日志里显示datadir = /tmp/mysql,说明你的配置没起作用。

3. 验证容器内的配置文件内容

确认挂载的配置文件是否真的被容器读取,且内容正确:

  • 在容器里查看配置文件内容:
    cat /etc/mysql/mysql.conf.d/mysqld.cnf
    
    检查datadir = /var/lib/mysql这一行有没有拼写错误,或者被注释掉了。
  • 另外,MySQL 5.6可能会读取其他优先级更高的配置文件,比如/etc/my.cnf或者/etc/mysql/my.cnf,你可以检查这些文件是否存在,里面有没有覆盖datadir的设置:
    ls -l /etc/my.cnf /etc/mysql/my.cnf
    cat /etc/my.cnf 2>/dev/null || echo "File not exists"
    

4. 检查数据目录的实际写入情况

如果上面的步骤确认了datadir是/var/lib/mysql,那再验证这个目录的写入情况:

  • 创建database_A后,在容器里查看/var/lib/mysql的文件变化:
    ls -l /var/lib/mysql | grep database_A
    stat /var/lib/mysql/ibdata1
    
    如果看不到database_A的文件夹,且ibdata1的修改时间没变化,说明MySQL根本没往这个目录写数据,可能是权限问题?比如容器内的mysql用户对/var/lib/mysql没有写权限?你可以检查目录权限:
    ls -ld /var/lib/mysql
    
    正常应该是mysql:mysql的权限。

额外排查小提示

  • 你的启动命令里同时用了--network host和-p 3307:3307,这其实是冲突的(host网络模式下端口映射不生效),不过这和数据存储无关,建议调整成二选一。
  • 可以检查宿主机的mysql_data目录权限,如果宿主机上这个目录是root:root权限,容器内的mysql用户(UID通常是999)可能无法写入,这时候需要修改宿主机目录权限:
    chown -R 999:999 $(pwd)/mysql_data
    

内容的提问来源于stack exchange,提问作者Miles High

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:22:27