故事背景
上班的时候突然收到群里的消息"测试环境数据库打不开了,帮忙看看"。我用Navicat点开测试环境数据库报错:reading initial communication packet
,deepseek查了一下说是一般都是服务没起来或 socket 配置问题,但这次远比我想象的复杂......
🛠️ 第一步:AI 提示服务状态异常
我第一时间把错误贴给 AI,它提示可能是:
- MySQL 服务未正常运行;
mysqld.sock
文件丢失;- 权限设置不当。
这个思路没问题,于是我登录服务器实地排查。
🔍 第二步:MySQL 的 PID 疯狂变化
执行经典排查命令:
perl
bash
复制编辑
ps -ef | grep mysql
我发现 MySQL 的 PID 每秒都在变,说明服务一直在"启动 ➝ 异常 ➝ 自动重启"的死循环中。
我想着只要我手速够快,就能把他kill掉,结果还是不行- -
查了下crontab的linux定时任务,发现也没有让mysql重启的定时任务。
我本想看看 error-log
是怎么说的,结果发现:日志根本没有写出来......
🧩 第三步:systemd+环境变量双坑组合
和同事聊了几句,他说他执行过:
sql
bash
复制编辑
systemctl start mysql
但没看是否成功启动。后来我发现当前系统没有正确配置 MySQL 环境变量,导致 systemd 启动失败后一直尝试自动重启。
所以才会出现 PID 一直变的情况。
我果断执行:
arduino
bash
复制编辑
systemctl stop mysql
服务终于停了,世界一片安静。
⚠️ 第四步:标准输出/错误输出未重定向
我尝试用 mysqld 命令手动启动:
css
bash
复制编辑
/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
结果系统提示:
bash
bash
复制编辑
Please set appropriate redirections for standard output and/or standard error in daemon mode.
原来 daemon 模式下需要手动设置输出路径,否则认为不规范拒绝执行。添加重定向即可解决:
javascript
bash
复制编辑
/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid > /dev/null 2>&1
🔐 第五步:权限不足,手动提权
启动 MySQL 时又报:
nginx
复制编辑
Permission denied
我发现当前用户并非 root,因此某些目录操作权限不足。
为了排查方便,我临时把当前用户改成 root 权限用户:
bash
bash
复制编辑
sudo vim /etc/passwd
将当前用户 UID 和 GID 改为 0(此操作仅用于测试排查,线上不推荐! )。
💽 第六步:日志不输出,磁盘已满
我又想看 error-log,结果发现还是没有更新,怀疑磁盘有问题。执行:
bash
bash
复制编辑
df -h
果然,磁盘满了!
导致 error-log 写不进去,所以完全没有日志。清空文件释放空间:
lua
bash
复制编辑
echo > /var/log/mysql/error.log
成功清空,日志终于开始正常输出!
🔒 第七步:Unix socket lock file 搞鬼
error-log 输出如下错误:
csharp
csharp
复制编辑
Unix socket lock file is empty /var/lib/mysql/mysql.sock.lock.
Unable to setup unix socket lock file.
意思是 MySQL 启动失败后遗留了一个空的 .sock.lock
文件,后续启动会检测它是否存在,导致失败。
解决方法:
bash
bash
复制编辑
rm -f /var/lib/mysql/mysql.sock.lock
再执行启动命令,MySQL 终于正常启动!
✅ 总结
这次排查过程虽然绕了点弯路,但涉及的知识点不少,快速总结如下:
问题 | 解决方法 |
---|---|
reading initial communication packet |
多半是 MySQL 没启动 or socket 文件缺失 |
PID 一直变 | systemd 自动重启失败导致的死循环 |
error-log 不输出 | 很可能是磁盘满了 |
daemon 模式报错 | 添加输出重定向 > /dev/null 2>&1 |
权限不足 | 确保当前用户拥有读写 MySQL 路径权限 |
.sock.lock 文件空且存在 |
手动删除重新启动 |
💡 建议
- 使用
systemctl
后一定要systemctl status
检查状态; - 日志缺失优先检查磁盘和权限;
- 自动重启容易掩盖真正的报错,要注意排查源头;
- 修改系统用户权限需谨慎,切勿长期使用 root UID。