mysql的进程id一直在变,kill -9也杀不掉

故事背景

上班的时候突然收到群里的消息"测试环境数据库打不开了,帮忙看看"。我用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。
相关推荐
码农sssss6 小时前
1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server
mysql
FungLeo8 小时前
安装和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录6
服务器·mysql·nginx
heart000_111 小时前
MySQL事务与锁机制详解:确保数据一致性的关键【MySQL系列】
数据库·mysql
一眼青苔11 小时前
MySQL 如何判断某个表中是否存在某个字段
数据库·mysql
天空之城夢主12 小时前
MySQL 全量、增量备份与恢复
数据库·mysql·oracle
依稀i12315 小时前
MySQL连接报SSL错误
数据库·mysql·ssl
kaede15 小时前
MySQL权限详解!
数据库·mysql
萝卜白菜。16 小时前
关于TongWeb数据源兼容mysql驱动的注意事项
java·mysql
进击的CJR16 小时前
MySQL 8.0 OCP 英文题库解析(十一)
mysql·adb·开闭原则
郝同学的测开笔记17 小时前
深入解析:如何优雅计算时间区间内的有效时长
后端·mysql·测试