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。
相关推荐
代码的余温35 分钟前
SQL性能优化全攻略
数据库·mysql·性能优化
回家路上绕了弯3 小时前
MySQL 详细使用指南:从入门到精通
java·mysql
MaxHua3 小时前
SQL语法大全指南:从基础到进阶的关键字与用法解析
后端·mysql
回家路上绕了弯3 小时前
MySQL 索引详解:从原理到最佳实践
后端·mysql
手把手入门3 小时前
★CentOS:MySQL数据备份
数据库·mysql·adb
小卓笔记4 小时前
MySQL库表操作
mysql
iVictor4 小时前
MySQL 密码防暴力破解插件:Connection Control
mysql
Seven974 小时前
了解Mysql优化吗?如何优化索引?
mysql
rannn_1115 小时前
【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
笔记·后端·学习·mysql
杰克尼5 小时前
MYSQL-175. 组合两个表
数据库·mysql