my.ini必须位于MySQL根目录且编码为ANSI或UTF-8无BOM,路径需用正斜杠、禁含中文空格,初始化后须用--defaults-file绑定服务,首次登录须改密并切换认证插件。

my.ini 路径和编码必须严格正确
Windows 下 ZIP 版 MySQL 启动失败,80% 源于 my.ini 文件位置或编码问题。它必须放在 MySQL 根目录(即含 bin、lib 的那一层),不能在子文件夹里;且必须保存为 ANSI 或 UTF-8 无 BOM 编码——用记事本直接保存默认是 ANSI,但若用 VS Code / Notepad++ 编辑,务必关掉“UTF-8 with BOM”选项,否则 mysqld 会静默忽略配置。
常见错误现象:mysqld --install 成功但 net start mysql 报错“服务没有响应控制功能”,或日志里出现 Can't find message file 'D:\mysql8\share\english\errmsg.sys',基本就是 basedir 路径写错,或 my.ini 编码/位置不对。
-
basedir和datadir路径中不要混用正斜杠/和反斜杠\;推荐统一用正斜杠/(如D:/mysql8),Windows 兼容性更好 - 路径中禁止出现中文、空格、括号、& 等字符,哪怕只是文件夹名里有“MySQL 8”也不行,必须是
D:/mysql8这类纯英文无空格路径 -
datadir对应的目录不需要手动创建,初始化时自动生成;但父级路径(如D:/mysql8/data的D:/mysql8)必须存在且可写
初始化必须用 --initialize 或 --initialize-insecure
解压后 data 目录为空,直接启动服务会失败。必须先执行初始化命令生成系统表和 root 密码。两种方式选其一:
- 用
mysqld --initialize --console:生成随机 root 密码,输出在控制台末尾(形如root@localhost: fGx#9q!mK2),必须立刻复制保存,后续登录要用 - 用
mysqld --initialize-insecure:不设初始密码,root用户空密码可登录,适合本地开发环境,但严禁用于公网服务器
注意:初始化只做一次。重复执行会清空已有 data 目录内容,导致数据库丢失。如果已初始化过又想重来,先删掉 data 文件夹再执行。
安装 Windows 服务时 --defaults-file 参数不能省
ZIP 版 MySQL 不自带服务注册逻辑,必须显式指定配置文件路径才能把 my.ini 绑定到服务。命令格式固定:
mysqld --install MySQL80 --defaults-file=D:/mysql8/my.ini
其中 MySQL80 是服务名(可自定义,但不能含空格),--defaults-file 必须是绝对路径,且指向根目录下的 my.ini。漏掉这个参数,服务启动后读的是默认内置配置,port、character-set-server 等全失效。
常见错误:
- 执行
mysqld --install不带参数 → 服务注册成功,但启动时报错“找不到插件”或“无法加载配置” -
--defaults-file路径写成相对路径(如my.ini)或路径错误 → 服务启动后立即退出,事件查看器里报错The service did not respond to the start or control request in a timely fashion.
首次登录后必须立刻修改密码并切换认证插件
MySQL 8.0 默认用 caching_sha2_password 插件,但很多旧客户端(如 Navicat 12 以下、某些 JDBC 驱动)不兼容,连上就报 Client does not support authentication protocol requested by server。
解决方法是在首次登录后立即执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
然后刷新权限:FLUSH PRIVILEGES;。这步不能跳过,否则即使改了 my.ini 里的 default_authentication_plugin,已存在的用户仍沿用旧插件。
另外,--initialize-insecure 初始化的实例,第一次登录不用密码,但登录后必须立刻设密码,否则任何人在本机都能无密访问。
真正容易被忽略的是:初始化生成的临时密码只在第一次登录有效,登录后 MySQL 强制要求改密;而用 --initialize-insecure 的话,虽然免密登录,但默认账户权限极低,SELECT USER(); 可能返回 'root'@'::1',对 localhost 无权限,得先 CREATE USER 'root'@'localhost' IDENTIFIED BY 'xxx'; GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION; 才算真正可用。


















