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。
相关推荐
Edingbrugh.南空16 分钟前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
BD_Marathon1 小时前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
程序猿小D2 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的电影小说网站管理系统,推荐!
java·数据库·mysql·spring·毕业设计·ssm框架·电影小说网站
羊小猪~~2 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
叁沐3 小时前
MySQL 05 深入浅出索引(下)
mysql
陈卓4103 小时前
MySQL-主从复制&分库分表
android·mysql·adb
你都会上树?4 小时前
MySQL MVCC 详解
数据库·mysql
长征coder5 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
ladymorgana5 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui5 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql