MySQL启动失败应先查错误日志,优先通过mysqld --verbose --help | grep "log_error"定位路径,再依次检查配置文件、默认路径及Docker日志;重点分析末尾5–10行[ERROR]信息,验证配置语法与文件权限,并确认日志目录可写。

先看日志,别猜原因
MySQL启动失败时,systemctl status mysql 或 service mysql status 只告诉你“它没起来”,真正说话的是错误日志。不查日志就改配置、重启、重装,90%会把问题搞复杂。
日志位置不是固定的,优先按这个顺序找:
- 执行
mysqld --verbose --help | grep "log_error",看输出里是否已指定路径 - 查配置文件:
grep "log_error" /etc/my.cnf /etc/mysql/my.cnf 2>/dev/null - 没配的话,按发行版默认位置查:
/var/log/mysqld.log(CentOS/RHEL)、/var/log/mysql/error.log(Ubuntu/Debian)、/usr/local/mysql/data/$(hostname).err(源码编译) - Docker 容器直接用
docker logs <container_id>,别翻宿主机文件系统
盯住最后10行里的 [ERROR] 和权限报错
日志动辄几万行,没必要从头扫。启动失败的线索几乎全集中在末尾——尤其是最后5–10行带 [ERROR] 的那几条。重点关注以下几类:
-
Can't start server: Bind on TCP/IP port: Address already in use→ 端口被占,用lsof -i :3306或ss -tuln | grep :3306查进程 -
InnoDB: Unable to lock ./ibdata1, error: 11→ 文件锁冲突,检查是否有残留mysqld进程:ps aux | grep mysqld -
Failed to open log file '/var/log/mysql/error.log' (Errcode: 13 - Permission denied)→mysql用户没权限写日志目录,运行chown mysql:mysql /var/log/mysql+chmod 755 /var/log/mysql -
Unknown suffix 'G' used for variable 'innodb_buffer_pool_size'→ 配置写法不兼容,MySQL 5.7 不认1G,得写成1073741824或1024M
配置错误可能静默失败,必须主动验证
有些配置错误不会在日志里留下明显 [ERROR],比如 log_error 路径本身写错、或 my.cnf 权限是 777(MySQL 会直接忽略该文件),结果就是:不报错、不写日志、不启服务——你连线索都拿不到。
所以启动前务必做两件事:
- 用
mysqld --defaults-file=/etc/my.cnf --validate-config校验配置语法(MySQL 5.7.16+ 支持) - 检查
my.cnf权限:ls -l /etc/my.cnf,必须是644或更严格,不能有写权限给 group/other(否则被忽略) - 如果怀疑数据目录异常,可临时用调试模式启动:
mysqld --console --defaults-file=/etc/my.cnf,错误会直接打到终端
Windows 下别漏掉隐藏路径和控制台输出
Windows 的错误日志常在 C:\ProgramData\MySQL\MySQL Server X.X\Data\*.err,而 ProgramData 是隐藏目录,资源管理器默认看不到。必须手动在地址栏输入完整路径,或启用“显示隐藏的项目”。
另外,Windows 启动服务时,控制台输出比日志更及时:
- 用管理员权限打开 CMD,执行
net start mysql或sc start mysql - 如果有报错,会直接打印在屏幕上,比如
System error 1067或Table 'mysql.user' doesn't exist,这说明数据目录没初始化或路径配置错 - 若服务卡住没反应,别只等,立刻去任务管理器看有没有
mysqld.exe进程在跑——有进程但没响应,大概率是磁盘满、权限不足或 innodb 恢复卡住
最常被跳过的一步是确认日志路径本身是否可写。哪怕日志路径写对了,如果上级目录权限不对,MySQL 就连创建日志文件都做不到,自然也不会留下任何线索。动手前先 sudo -u mysql touch /path/to/log/test.log 2>/dev/null && echo ok || echo fail,省下半小时瞎折腾。


















