必须挂载/var/lib/mysql,否则删容器即丢数据;MySQL 8.4需避开已废弃参数、显式赋权宿主机目录、统一字符集、双保险设时区、分离日志与数据路径,并验证socket属组。

MySQL 8.4 容器默认不持久化数据,删掉容器就丢库——必须显式挂载 /var/lib/mysql 并避开已移除的旧参数,否则启动直接报错。
docker-compose.yml 必须避开 MySQL 8.4 已废弃的启动参数
MySQL 8.4.5 移除了 --default-character-set、--innodb_log_file_size(需用新方式)、skip-external-locking 等 8.0 早期参数。若在 command 或配置文件里硬写,容器会卡在 mysqld: unknown option 错误并退出。
- 只保留安全可用的启动参数:
--character-set-server=utf8mb4、--collation-server=utf8mb4_0900_ai_ci、--default-time-zone=+8:00 - 字符集相关配置必须统一:命令行 +
conf/my.cnf里都设成utf8mb4_0900_ai_ci,混用utf8mb4_unicode_ci可能导致初始化失败 -
my.cnf中禁用skip-host-cache和skip-name-resolve——8.4 默认启用 host cache,强行跳过会触发 warning 并可能影响连接池行为
卷挂载必须用相对路径 + 显式目录初始化
直接 docker-compose up 时,若宿主机 ./data 是空目录,MySQL 8.4 会尝试初始化但失败(报 mysqld: Can't create/write to file),因为容器内 mysql 用户对挂载点无写权限。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 先手动创建并赋权:
mkdir -p ./data ./log ./conf,再执行sudo chown -R 999:999 ./data ./log(MySQL 8.4 镜像默认以 UID 999 运行) - 不要用
docker volume create后再映射到/var/lib/mysql——命名卷无法保证初始权限,且调试日志难定位;绑定挂载(./data:/var/lib/mysql)更可控 -
./conf下的my.cnf必须是 Unix 换行(LF),Windows 编辑器保存后带 CRLF 会导致容器启动时解析失败,错误信息为unknown variable ''
时区和日志路径要显式声明,否则容器内时间错乱、日志写入失败
MySQL 8.4 容器默认时区是 UTC,TZ 环境变量仅影响 shell 层,不透传给 mysqld 进程;同时默认日志路径 /var/log/mysql 在某些镜像版本中不可写。
- 在
environment中加TZ: Asia/Shanghai,并在command中追加--default-time-zone=+8:00,双保险 -
volumes必须包含./log:/var/log/mysql,且确保宿主机./log目录存在、权限为 755、属主为 999 - 避免把日志和数据挂到同一级目录(如都用
./mysql),否则chown -R 999可能误改配置文件权限,导致 mysqld 拒绝加载my.cnf
首次启动后必须立刻验证 root 密码和 socket 权限
MySQL 8.4 初始化完成后,root 密码虽由 MYSQL_ROOT_PASSWORD 设置,但容器内 socket 文件 /var/run/mysqld/mysqld.sock 的属组可能不是 mysql,导致本地客户端连接报 Can't connect to local MySQL server through socket。
- 启动后立即执行:
docker exec -it mysql84 ls -l /var/run/mysqld/,确认mysqld.sock属主是mysql:mysql - 若属主异常,进容器手动修复:
docker exec -it mysql84 bash -c "chown mysql:mysql /var/run/mysqld/mysqld.sock" - 连接测试别只用
mysql -uroot -p,要加-h 127.0.0.1强制走 TCP,绕过 socket 权限问题,确认服务真正就绪
exited with code 1 在 docker ps -a 里。

















