Windows 安装 MySQL 5.7 启动失败:Starting the server Failed、Permission denied、mysql.plugin 不存在解决记录
前言
最近在 Windows 环境安装 MySQL Server 5.7.44 时,MySQL Installer 在配置阶段出现了启动失败。
安装程序前面的步骤基本都成功:
Writing configuration file √
Updating Windows Firewall rules √
Adjusting Windows service √
Initializing database √
Starting the server ×
最终卡在:
Starting the server
并显示:
Failed
整个问题排查下来,并不是单一原因,而是一连串问题:
Data 目录权限异常
↓
MySQL 初始化不完整
↓
mysql 系统库缺失
↓
my.ini 存在不兼容配置
↓
MySQL 服务无法启动
本文记录整个问题从发现、定位到最终解决的完整过程。
环境:Windows + MySQL Server 5.7.44
⚠️ 如果你的 MySQL 已经存在业务数据,请不要直接执行本文中的 Data 目录重建操作。
一、问题现象
MySQL Installer 安装到最后的配置阶段时:
Starting the server
出现:
Failed
于是尝试通过 Windows 服务手动启动 MySQL:
net start MySQL57
结果:
MySQL57 服务正在启动 .
MySQL57 服务无法启动。
服务没有报告任何错误。
请键入 NET HELPMSG 3534 以获得更多的帮助。
继续执行:
NET HELPMSG 3534
得到:
服务没有报告任何错误。
这里的问题是:
Windows Service 只告诉我们 MySQL 启动失败,但是没有告诉我们 MySQL 为什么启动失败。
所以需要继续向下排查。
二、确认 MySQL57 服务是否存在
首先检查 MySQL 服务是否已经成功注册。
在 PowerShell 中执行:
sc.exe query MySQL57
得到:
SERVICE_NAME: MySQL57
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 0
SERVICE_EXIT_CODE : 0
这里可以确认:
MySQL57 服务存在
+
当前状态 STOPPED
也就是说:
MySQL 已经成功注册成 Windows Service,但是 mysqld.exe 启动失败。
三、PowerShell 中需要注意 sc 和 sc.exe
这里顺便记录一个 Windows PowerShell 的小坑。
一开始执行:
sc qc MySQL57
没有得到预期结果。
原因是 PowerShell 中:
sc
可能被解释为 PowerShell 自己的命令别名。
所以在 PowerShell 中建议明确使用:
sc.exe qc MySQL57
查看 MySQL 服务配置。
例如:
sc.exe qc MySQL57
可以看到类似:
SERVICE_NAME: MySQL57
BINARY_PATH_NAME:
"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe"
--defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
MySQL57
由此确定两个非常重要的路径。
MySQL Server:
C:\Program Files\MySQL\MySQL Server 5.7\
配置文件:
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
四、检查 3306 端口是否被占用
MySQL 默认使用:
3306
所以首先排除端口冲突。
执行:
netstat -ano | findstr :3306
当时没有任何输出。
也就是说:
3306 端口没有程序监听
因此可以基本排除:
- 其他 MySQL 实例
- MariaDB
- 其他数据库
- 其他应用程序
占用 3306 导致 MySQL 启动失败的问题。
五、最关键的一步:直接使用 mysqld --console 启动
这是这次排查过程中最重要的一步。
Windows Service 只告诉我们:
MySQL57 服务无法启动
但是没有给出真正的 MySQL 错误。
因此不要继续猜,直接运行 mysqld.exe。
使用管理员 PowerShell执行:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --console
注意:
PowerShell 中程序路径包含空格,所以前面的:
&
不要漏掉。
执行以后,终于出现了真正的错误:
mysqld: Can't change dir to
'C:\ProgramData\MySQL\MySQL Server 5.7\Data\\'
(Errcode: 13 - Permission denied)
同时还有:
Can't create test file
C:\ProgramData\MySQL\MySQL Server 5.7\Data\FQ-MGJXHKQOPTHC.lower-test
最终:
[ERROR] failed to set datadir to
C:\ProgramData\MySQL\MySQL Server 5.7\Data\\
[ERROR] Aborting
至此,第一个真正的问题终于找到了:
MySQL 没有权限访问 Data 数据目录。
六、确认 MySQL Data 数据目录
从 my.ini 可以确认 MySQL Data 目录:
C:\ProgramData\MySQL\MySQL Server 5.7\Data
而 MySQL57 Windows Service 使用的服务账户是:
NT AUTHORITY\NetworkService
因此理论上需要保证:
NETWORK SERVICE
拥有访问 MySQL Data 目录的权限。
七、尝试给 NETWORK SERVICE 授权
首先尝试:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "NETWORK SERVICE:(OI)(CI)F" /T
结果:
C:\ProgramData\MySQL\MySQL Server 5.7\Data: 拒绝访问。
已成功处理 0 个文件;
处理 1 个文件时失败
这说明问题已经不仅仅是:
MySQL 没有权限
而是:
当前管理员用户也无法正常修改 Data 目录权限
八、takeown 也出现拒绝访问
继续尝试获取 Data 目录所有权:
takeown /F "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /R /D Y
结果:
错误: 拒绝访问。
这个现象让我进一步检查 PowerShell 本身的管理员权限。
需要注意:
即使当前登录用户叫:
Administrator
也不代表当前 PowerShell 已经完成 UAC 提权。
可以执行:
net session
检查当前 PowerShell 是否真正拥有管理员权限。
如果出现:
系统错误 5
拒绝访问
说明 PowerShell 没有真正以管理员权限运行。
正确操作:
开始菜单
↓
搜索 PowerShell
↓
右键
↓
以管理员身份运行
九、重新获取 Data 目录所有权
使用真正的管理员 PowerShell 后执行:
takeown /F "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /A /R /D Y
这次成功:
成功: 此文件(或文件夹):
"C:\ProgramData\MySQL\MySQL Server 5.7\Data"
现在由管理员组所有。
Data 目录下面的文件也全部成功取得所有权,例如:
FQ-MGJXHKQOPTHC.err
ibdata1
ib_buffer_pool
ib_logfile0
ib_logfile1
这里:
/A
表示:
将所有权赋给 Administrators 组
十、重新给 Administrators 和 NETWORK SERVICE 授权
首先给 Administrators 完全控制权限:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "Administrators:(OI)(CI)F" /T /C
执行结果:
已成功处理 6 个文件;
处理 0 个文件时失败
然后给 MySQL 服务账户 NETWORK SERVICE 权限:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "NETWORK SERVICE:(OI)(CI)F" /T /C
执行结果:
已成功处理 6 个文件;
处理 0 个文件时失败
这里几个参数的含义:
(OI) 文件继承
(CI) 子目录继承
F Full Control,完全控制
/T 递归处理
/C 遇到错误继续处理
至此:
Data Permission denied
问题已经解决。
十一、修复权限后 MySQL 仍然启动失败
重新执行:
net start MySQL57
结果仍然是:
MySQL57 服务正在启动 .
MySQL57 服务无法启动。
服务没有报告任何错误。
这时候不要认为前面的判断错了。
实际上:
第一个错误修复以后,第二个错误才有机会暴露出来。
所以再次执行:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --console
这一次:
Permission denied
已经消失。
证明 Data 权限修复成功。
但是出现了新的错误。
十二、第二个核心错误:mysql.plugin doesn’t exist
新的错误信息:
mysqld: Table 'mysql.plugin' doesn't exist
同时:
[ERROR] Can't open the mysql.plugin table.
Please run mysql_upgrade to create it.
继续观察 Data 目录。
当时 Data 目录主要只有:
FQ-MGJXHKQOPTHC.err
ibdata1
ib_buffer_pool
ib_logfile0
ib_logfile1
但是一个正常初始化完成的 MySQL Data 目录应该包含类似:
Data
├── mysql
├── performance_schema
├── sys
├── ibdata1
├── ib_logfile0
├── ib_logfile1
└── ...
而当前:
mysql
performance_schema
sys
等系统数据库并没有正常生成。
因此可以判断:
第一次安装 MySQL 时,由于 Data 目录权限异常,数据库初始化过程实际上没有完整完成。
形成了下面的故障过程:
MySQL Installer
↓
Initializing Database
↓
开始创建 Data 文件
↓
Data 权限异常
↓
初始化过程失败/不完整
↓
留下部分 InnoDB 文件
↓
mysql 系统数据库没有完整创建
所以:
即使现在已经修复 Data 权限,MySQL 仍然无法正常启动。
十三、第三个错误:unknown variable ‘mysqlx_port=0.0’
同一次 mysqld --console 输出中,还有另外一个重要错误:
[ERROR] unknown variable 'mysqlx_port=0.0'
说明配置文件:
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
中存在当前 MySQL Server 无法识别的配置。
打开配置文件:
notepad "C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
搜索:
mysqlx_port
找到:
mysqlx_port=0.0
将其注释:
# mysqlx_port=0.0
然后保存配置文件。
十四、重新初始化 MySQL Data
⚠️ 重要警告
下面的 Data 重建操作只适用于:
MySQL 全新安装 + 没有业务数据 + 初始化已经失败
如果你的 MySQL 已经存在业务数据库、业务表或者生产数据,请不要直接重建 Data 目录。
否则可能造成数据丢失。
由于我的环境属于刚安装 MySQL,还没有任何业务数据,所以可以重新初始化。
首先停止 MySQL:
net stop MySQL57
如果提示:
MySQL57 服务没有启动
可以忽略。
为了安全,不直接删除旧 Data,而是先备份:
Rename-Item "C:\ProgramData\MySQL\MySQL Server 5.7\Data" "Data_failed"
重新创建 Data:
New-Item -ItemType Directory -Path "C:\ProgramData\MySQL\MySQL Server 5.7\Data"
重新赋予 MySQL 服务权限:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "NETWORK SERVICE:(OI)(CI)F" /T
然后重新初始化 MySQL:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --initialize --console
初始化成功以后,Data 目录应该生成完整的系统数据库,例如:
mysql
performance_schema
sys
ibdata1
ib_logfile0
ib_logfile1
...
初始化过程中还可能生成 root 临时密码,例如:
A temporary password is generated for root@localhost: xxxxxxxxx
需要记住这个密码。
十五、重新启动 MySQL57
完成上面的处理以后,再次执行:
net start MySQL57
这次终于成功:
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
继续检查:
sc.exe query MySQL57
得到:
SERVICE_NAME: MySQL57
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
最重要的是:
STATE : 4 RUNNING
这说明:
MySQL57 Windows Service 已经正常运行。
十六、检查 3306 端口
继续执行:
netstat -ano | findstr :3306
得到:
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 19536
TCP [::]:3306 [::]:0 LISTENING 19536
说明:
MySQL57
↓
mysqld.exe
↓
3306
↓
LISTENING
MySQL Server 已经成功监听 3306。
最终状态:
MySQL57 RUNNING
3306 LISTENING
问题解决。
十七、登录 MySQL 验证
执行:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" -u root -p
输入 root 密码。
成功后进入:
mysql>
检查 MySQL 版本:
SELECT VERSION();
MySQL 5.7.44 应该返回类似:
5.7.44-log
继续检查数据库:
SHOW DATABASES;
正常情况下至少应该存在:
information_schema
mysql
performance_schema
sys
如果这些系统数据库都存在,说明 MySQL 初始化已经正常。
十八、修改 root 密码
进入 MySQL 后执行:
ALTER USER 'root'@'localhost'
IDENTIFIED BY '你的新密码';
然后:
FLUSH PRIVILEGES;
退出:
exit;
重新登录验证:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" -u root -p
输入新密码。
如果能够正常登录,说明 root 密码修改成功。
十九、完整故障链路总结
整个问题回头来看,其实是一个连续故障链:
安装 MySQL Server 5.7.44
↓
MySQL Installer 配置数据库
↓
Data 目录权限异常
↓
NETWORK SERVICE 无法访问 Data
↓
mysqld Permission denied
↓
MySQL 初始化不完整
↓
mysql 系统数据库缺失
↓
mysql.plugin doesn't exist
↓
同时 my.ini 存在 mysqlx_port 不兼容配置
↓
mysqld Aborting
↓
Starting the server Failed
↓
MySQL57 Windows Service 无法启动
最终解决过程:
Starting the server Failed
↓
sc.exe query MySQL57
↓
检查 3306 端口
↓
mysqld --console
↓
发现 Permission denied
↓
takeown 获取 Data 所有权
↓
icacls 修复目录权限
↓
再次 mysqld --console
↓
发现 mysql.plugin doesn't exist
↓
发现 mysqlx_port 配置异常
↓
修改 my.ini
↓
重新初始化 Data
↓
net start MySQL57
↓
STATE : 4 RUNNING
↓
3306 LISTENING
↓
问题解决
二十、这次排查最重要的经验
1. Starting the server Failed 不等于需要重新安装
MySQL Installer 只告诉我们:
Starting the server Failed
但导致启动失败的原因可能非常多,例如:
端口冲突
目录权限
my.ini 配置错误
Data 初始化失败
InnoDB 异常
Windows Service 权限
系统数据库损坏
因此不要看到:
Failed
就立即卸载重装。
应该先找到:
mysqld.exe 为什么退出。
2. mysqld --console 是非常重要的排查手段
如果:
net start MySQL57
只返回:
服务无法启动
服务没有报告任何错误
可以直接执行:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --console
这样能够直接看到 MySQL Server 的启动日志。
本文就是通过这个方法依次发现:
Permission denied
mysql.plugin doesn't exist
unknown variable 'mysqlx_port=0.0'
如果没有 mysqld --console,只依赖 Windows Service 的:
服务无法启动
很难快速定位真正的问题。
3. 修复一个错误后可能还有下一个错误
第一次执行 mysqld --console:
Permission denied
修复 Data 权限以后,再次执行:
mysql.plugin doesn't exist
然后又发现:
unknown variable 'mysqlx_port=0.0'
这说明排查问题时不能认为:
找到一个错误 = 找到全部问题
更合理的方法是:
发现第一个 ERROR
↓
解决
↓
重新运行
↓
观察新的 ERROR
↓
继续解决
一直到 MySQL 正常启动。
4. PowerShell 中注意 sc 和 sc.exe
在 CMD 中经常使用:
sc query MySQL57
但在 PowerShell 中建议使用:
sc.exe query MySQL57
以及:
sc.exe qc MySQL57
避免 PowerShell 命令别名造成干扰。
5. Administrator 用户不等于当前终端已经提权
即使当前目录显示:
PS C:\Users\Administrator>
也不能百分百说明 PowerShell 已经以管理员权限运行。
如果:
takeown
或者:
icacls
一直出现:
拒绝访问
可以执行:
net session
检查当前 PowerShell 是否真正具有管理员权限。
必要时:
右键 PowerShell
↓
以管理员身份运行
6. Data 目录千万不要随便删除
如果只是:
全新安装
+
没有业务数据
+
初始化已经失败
可以考虑重新初始化 Data。
但是如果 MySQL 中已经存在:
生产数据库
业务数据库
业务表
重要数据
不要直接:
删除 Data
或者重新:
--initialize
这种情况下应该按照 MySQL 数据恢复的思路处理,否则可能导致数据丢失。
二十一、快速排查命令汇总
以后如果再次遇到:
MySQL Starting the server Failed
可以按照下面的顺序排查。
1. 查看 MySQL 服务状态
sc.exe query MySQL57
2. 查看 MySQL 服务配置
sc.exe qc MySQL57
3. 检查 3306 端口
netstat -ano | findstr :3306
4. 直接运行 mysqld 查看真正错误
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --console
5. 如果出现 Data Permission denied
先确认管理员 PowerShell,然后:
takeown /F "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /A /R /D Y
给 Administrators 权限:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "Administrators:(OI)(CI)F" /T /C
给 MySQL 服务账户权限:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "NETWORK SERVICE:(OI)(CI)F" /T /C
6. 如果出现 mysqlx_port 配置错误
打开:
notepad "C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"
将:
mysqlx_port=0.0
修改为:
# mysqlx_port=0.0
7. 如果是全新安装并且系统库初始化失败
⚠️ 仅适用于没有业务数据的新安装环境。
备份旧 Data:
Rename-Item "C:\ProgramData\MySQL\MySQL Server 5.7\Data" "Data_failed"
创建新的 Data:
New-Item -ItemType Directory -Path "C:\ProgramData\MySQL\MySQL Server 5.7\Data"
授权:
icacls "C:\ProgramData\MySQL\MySQL Server 5.7\Data" /grant "NETWORK SERVICE:(OI)(CI)F" /T
初始化:
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --initialize --console
8. 启动 MySQL
net start MySQL57
9. 验证服务
sc.exe query MySQL57
看到:
STATE : 4 RUNNING
说明服务正常。
10. 验证 3306
netstat -ano | findstr :3306
看到:
0.0.0.0:3306 LISTENING
说明 MySQL 已经正常监听。
二十二、最终结果
最终 MySQL 状态:
MySQL Server:5.7.44
MySQL57:RUNNING
3306:LISTENING
Data:正常
root:可以正常登录
至此问题解决。
总结
这次 MySQL 5.7 安装失败,表面现象只是:
Starting the server Failed
但是最终排查发现实际上存在多个连续问题:
Data 目录权限异常
+
MySQL 系统数据库初始化不完整
+
my.ini 配置异常
最终通过:
mysqld --console 定位真正错误
↓
takeown 获取 Data 所有权
↓
icacls 修复目录权限
↓
修改 my.ini
↓
重新初始化 Data
↓
启动 MySQL57
成功解决。
最后验证:
MySQL57:RUNNING
3306:LISTENING
这次排查给我最大的经验就是:
Windows 服务启动失败时,不要只盯着“服务无法启动”这句话,而应该尽量找到服务背后的程序本身,并直接查看它的启动日志。
对于 MySQL 来说:
mysqld --console
往往比反复重装更容易找到真正的问题。
432



被折叠的 条评论
为什么被折叠?



