必须挂载/var/lib/mysql到宿主机绝对路径,因MySQL 8.0所有数据(系统库、redo log、ibdata1、数据字典)均写入该目录;不挂载则数据存于临时文件系统,容器删除后彻底丢失。

必须挂载 /var/lib/mysql 到宿主机绝对路径
MySQL 8.0 官方镜像把所有数据(系统库、redo log、ibdata1、数据字典)全写死在 /var/lib/mysql,不挂载就等于存在容器临时文件系统里,docker-compose down 后数据彻底消失——没有例外,也没有替代路径。
常见错误包括:
- 挂到
/etc/mysql或/data这类非数据目录,容器启动直接失败,日志出现Can't open the mysql.plugin table - 用相对路径如
./mysql-data,Docker 会静默忽略或报错invalid volume specification - 挂载父级目录(如
/data)且里面已有其他文件,MySQL 初始化逻辑会被干扰,卡在Initializing database
正确做法是:提前创建空目录,设对属主,再挂载:
sudo mkdir -p /data/mysql8 sudo chown -R 999:999 /data/mysql8
注意:MySQL 8.0 容器内默认以 UID 999 用户运行,不是 root,也不是你当前 shell 用户;chmod 777 无效,SELinux 或某些发行版会直接拒绝。
volumes 字段里用绑定挂载(bind mount),别依赖命名卷
虽然 docker volume create mysql-data 能用,但生产环境更推荐绑定挂载,因为:
- 备份直接
rsync /data/mysql8,不用查docker volume inspect找路径 - 排查问题时能
ls -l /data/mysql8看文件时间戳、大小、属主,一眼识别是否初始化成功 - 迁移只需复制整个目录,不依赖 Docker daemon 状态或 volume 元数据
在 docker-compose.yml 中写法必须是绝对路径:
volumes: - /data/mysql8:/var/lib/mysql
不能写成 ./mysql-data:/var/lib/mysql 或 mysql-data:/var/lib/mysql(后者是命名卷,不可见、难调试)。
MYSQL_ROOT_PASSWORD 不生效?先检查挂载目录是否为空
这个环境变量只在首次初始化数据库时起作用。如果 /data/mysql8 已存在旧文件(哪怕是上次中断留下的 ib_logfile0 或残留的 mysql/ 目录),MySQL 会跳过初始化,直接加载现有数据——此时 MYSQL_ROOT_PASSWORD、MYSQL_DATABASE、MYSQL_USER 全部被忽略。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
典型表现:
- 容器反复重启,日志卡在
mysqld: Can't open the mysql.plugin table - 用
mysql -uroot -p登录,密码还是旧的,或者连不上 - 进容器执行
ls /var/lib/mysql,发现已有mysql/、sys/、ibdata1
解决办法只有两个:
- 清空重来:
sudo rm -rf /data/mysql8 && sudo mkdir -p /data/mysql8 && sudo chown -R 999:999 /data/mysql8 - 确认该目录是同版本 MySQL 8.0.33 生成的干净数据(不同小版本间数据字典可能不兼容)
配置文件挂载位置和加载顺序要严格匹配
MySQL 8.0 容器按固定顺序加载配置:/etc/mysql/my.cnf → /etc/mysql/conf.d/*.cnf → /etc/mysql/mysql.conf.d/*.cnf。挂错位置会导致配置不生效。
例如想改认证插件,必须确保 default_authentication_plugin=mysql_native_password 写在 /etc/mysql/conf.d/ 下的某个 .cnf 文件里,而不是随便挂到 /etc/mysql 根目录。
推荐写法(在 docker-compose.yml 中):
volumes: - /data/mysql8:/var/lib/mysql - /data/mysql8/conf/my.cnf:/etc/mysql/conf.d/my.cnf
其中 /data/mysql8/conf/my.cnf 内容示例:
[mysqld] default_authentication_plugin=mysql_native_password innodb_buffer_pool_size=1G character_set_server=utf8mb4 collation_server=utf8mb4_unicode_ci
注意:配置挂载不会覆盖初始化逻辑,但会影响后续启动行为;如果初始化已失败,先解决数据目录问题,再调配置。










