Docker重启后MySQL数据库丢失问题排查求助
验证MySQL容器数据实际存储位置的步骤
根据你的描述,虽然挂载了/var/lib/mysql卷,但数据似乎没写入这个路径,大概率是MySQL运行时实际使用的datadir和你配置的不一致,或者配置文件没生效。下面是一步步的验证方法:
1. 直接查询MySQL运行时的实际datadir
这是最准确的方式,能直接告诉你MySQL当前正在使用的数据目录:
- 先进入容器的bash终端:
docker exec -it mysql bash - 登录MySQL(输入你设置的密码
secret):mysql -uroot -psecret - 在MySQL命令行执行查询:
这个结果会直接显示MySQL的实际数据存储路径,如果返回的不是SHOW VARIABLES LIKE 'datadir';/var/lib/mysql,那问题根源就找到了。
2. 检查MySQL启动日志,确认配置加载情况
有时候配置文件可能没被正确加载,或者启动参数覆盖了配置:
- 查看容器的启动日志:
找包含docker logs mysqldatadir的行,或者类似Reading configuration from的日志,确认MySQL是否加载了你挂载的mysql.conf.d/mysqld.cnf,以及里面的datadir设置是否生效。比如如果日志里显示datadir = /tmp/mysql,说明你的配置没起作用。
3. 验证容器内的配置文件内容
确认挂载的配置文件是否真的被容器读取,且内容正确:
- 在容器里查看配置文件内容:
检查cat /etc/mysql/mysql.conf.d/mysqld.cnfdatadir = /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/ibdata1database_A的文件夹,且ibdata1的修改时间没变化,说明MySQL根本没往这个目录写数据,可能是权限问题?比如容器内的mysql用户对/var/lib/mysql没有写权限?你可以检查目录权限:
正常应该是ls -ld /var/lib/mysqlmysql: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
相关产品推荐
相关产品推荐

