前言本文记录 WSL 环境下使用 Docker 部署 MySQL 9.5.0 的完整过程包含所有遇到的报错、根源分析及一步到位的解决方案适合新手避坑全程可复制操作最终实现 MySQL 正常运行、外部成功连接。一、环境说明运行环境WSLUbuntu Docker Docker ComposeMySQL 版本9.5.0最初因版本兼容踩坑最终成功部署核心需求部署 MySQL 9.5.0确保服务正常运行支持外部WSL/本地连接二、全程踩坑记录报错解决方案本次部署从 MySQL 启动失败到权限报错、连接失败全程踩坑6个逐一解决后实现正常运行以下按报错顺序整理每个问题均附根源可复制解决方案。坑1MySQL 版本升级兼容报错最开始的核心问题报错信息2026-04-26T11:50:20.589930Z 1 [ERROR] [MY-014060] [Server] Invalid MySQL server upgrade: Cannot upgrade from 80046 to 90500. Upgrade to next major version is only allowed from the last LTS release, which version 80046 is not.2026-04-26T11:50:20.590133Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.2026-04-26T11:50:20.590151Z 0 [ERROR] [MY-010119] [Server] Aborting报错根源本地数据目录./mysql/data中残留了 MySQL 8.0.46 的旧数据而 MySQL 9.5.0 不支持直接从非 LTS 版本8.0.46升级导致数据字典初始化失败服务启动 abort。解决方案核心清空旧数据目录或直接更换新的数据目录推荐更换避免删不干净步骤如下1. 停止并删除当前 MySQL 容器docker-compose down2. 重命名旧数据目录备份避免误删mv ./mysql/data ./mysql/data_old3. 新建空的数据目录mkdir ./mysql/data4. 重新启动容器后续会优化配置此处先解决数据冲突docker-compose up -d坑2数据目录权限不足无法删除/操作文件报错信息rm: cannot remove ‘data/public_key.pem’: Permission deniedrm: cannot remove ‘data/#innodb_redo’: Permission denied…所有数据目录下的文件均报权限不足报错根源Docker 容器内的 MySQL 进程以 mysql 用户uid999运行本地 WSL 普通用户没有权限操作容器挂载目录下的文件导致无法删除旧数据或修改目录。解决方案用 sudo 提升权限强制操作目录或直接更换数据目录如坑1所示强制清空数据目录若未更换目录需执行此步sudo rm -rf ./mysql/data/*坑3Docker 挂载路径不存在容器启动失败报错信息Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting “/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu/…” to rootfs at “/var/lib/mysql”: no such file or directory报错根源删除旧数据目录后Docker 仍记录着旧的挂载路径导致容器启动时无法找到对应的挂载目录触发路径不存在报错。解决方案彻底关闭 WSL 和 Docker删除旧容器重新启动1. 彻底关闭 WSL清除缓存wsl --shutdown2. 删除报错的 MySQL 容器容器名mysql-server按实际修改docker rm -f mysql-server3. 重新启动容器docker-compose up -d坑4MySQL 9.5.0 不支持旧配置参数启动失败报错信息2026-04-26T12:06:40.942718Z 0 [ERROR] [MY-000067] [Server] unknown variable ‘default-authentication-pluginmysql_native_password’.报错根源Docker Compose 配置中command 参数包含了 MySQL 8.x 的旧配置项 --default-authentication-pluginmysql_native_password而 MySQL 9.5.0 已废弃该参数导致启动报错。解决方案修改 Docker Compose 配置删除废弃参数最终可用配置如下完整可复制mysql:image: mysql:9.5.0container_name: mysql-serverenvironment:- MYSQL_ROOT_PASSWORDroot123 # root 密码ports:- “13306:3306” # 端口映射外部13306内部3306volumes:- ./mysql/data:/var/lib/mysql # 数据目录挂载- ./mysql/init:/docker-entrypoint-initdb.d # 初始化脚本挂载无需求可删除command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci # 仅保留字符集配置networks:- test-ruoyi01 # 网络配置按自己的网络名修改坑5MySQL 启动成功但表不存在数据目录未清空干净报错信息mysqld: Table ‘mysql.plugin’ doesn’t exist2026-04-26T12:09:24.551647Z 0 [ERROR] [MY-010735] [Server] Could not open the mysql.plugin table. Please perform the MySQL upgrade procedure.2026-04-26T12:09:24.728314Z 0 [ERROR] [MY-010326] [Server] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.user’ doesn’t exist报错根源虽然更换了数据目录但可能未彻底清空仍残留少量旧数据文件导致 MySQL 9.5.0 初始化时无法创建系统表如 mysql.user、mysql.plugin。解决方案重新执行“停止容器→清空/更换数据目录→重启容器”步骤确保数据目录完全为空1. 停止容器docker-compose down2. 彻底清空新数据目录确保无残留sudo rm -rf ./mysql/data/*3. 重启容器MySQL 会重新初始化系统表docker-compose up -d执行后MySQL 会正常初始化系统表自动创建启动日志最后会显示“ready for connections”代表启动成功。坑6MySQL 启动成功但外部/数据库工具连接失败报错信息DBMS: MySQL (ver. 9.5.0)Case sensitivity: plainmixed, delimitedexactNotBefore: Sun Apr 26 12:12:01 UTC 2026.Failed报错根源有两个核心原因root 用户默认只能在容器内访问无法从外部WSL/本地连接MySQL 9.5.0 对 TLS 协议版本有要求默认 TLS 版本不兼容导致连接被拒绝。解决方案分两步解决先授权 root 用户再修改连接参数步骤1给 root 用户授权允许外部访问1. 进入 MySQL 容器root 账号登录密码 root123docker exec -it mysql-server mysql -uroot -proot1232. 执行授权语句复制3行逐行执行ALTER USER ‘root’‘%’ IDENTIFIED BY ‘root123’;GRANT ALL PRIVILEGES ON.TO ‘root’‘%’ WITH GRANT OPTION;FLUSH PRIVILEGES;3. 退出容器输入 exit 即可步骤2修改外部连接参数添加 TLS 版本和必要参数最终可用的 JDBC 连接配置复制到项目配置或数据库工具中spring.datasource.urljdbc:mysql://localhost:13306/?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8allowPublicKeyRetrievaltrueenabledTLSProtocolsTLSv1.2spring.datasource.usernamerootspring.datasource.passwordroot123spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver关键参数说明缺一不可useSSLfalse关闭 SSL 验证避免连接被拦截allowPublicKeyRetrievaltrue允许公钥检索解决 MySQL 8 以上连接权限问题enabledTLSProtocolsTLSv1.2指定 TLS 协议版本解决 MySQL 9.5.0 证书时间不匹配问题serverTimezoneGMT%2B8设置时区为东八区避免时间同步错误。三、最终成功验证MySQL 容器正常运行执行 docker ps能看到 mysql-server 容器状态为 Up数据库连接成功用数据库工具Navicat/DBeaver或项目连接能正常访问 MySQL 服务外部访问正常从 WSL 或本地通过 root 账号能成功登录 MySQL执行常规操作。四、避坑总结新手必看MySQL 9.x 不兼容 8.x 非 LTS 版本的旧数据部署前务必清空/更换数据目录MySQL 9.x 废弃了 8.x 的部分配置参数如 default-authentication-plugin配置时需删除Docker 挂载目录权限问题用 sudo 提升权限即可解决MySQL 9.x 连接需指定 TLS 1.2 版本否则会出现证书相关报错root 用户需授权外部访问‘%’ 表示允许所有IP否则无法从容器外部连接。五、常用命令汇总可复制备用1. 关闭 WSL清除缓存wsl --shutdown2. 停止并删除 MySQL 容器docker-compose downdocker rm -f mysql-server3. 清空数据目录sudo rm -rf ./mysql/data/*4. 重启 MySQL 容器docker-compose up -d5. 进入 MySQL 容器root 登录docker exec -it mysql-server mysql -uroot -proot1236. root 用户授权进入容器后执行允许外部访问ALTER USER ‘root’‘%’ IDENTIFIED BY ‘root123’;GRANT ALL PRIVILEGES ON.TO ‘root’‘%’ WITH GRANT OPTION;FLUSH PRIVILEGES;结尾本次部署全程踩坑均为 MySQL 9.5.0 与旧环境、旧配置的兼容问题只要按步骤清空数据、修改配置、授权用户就能顺利部署并实现外部连接。如果遇到其他报错可对照本文排查或留言补充问题~