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。
相关推荐
爱吃火鸡面呀3 分钟前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
知行产研24 分钟前
中国矿山无人驾驶出海的三重门
数据库·mysql·php
爱和冰阔落1 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
Dxy12393102162 小时前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
wear工程师2 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
方便面不加香菜3 小时前
MySQL 复合查询
数据库·mysql
花花鱼3 小时前
MySQL Illegal mix of collations 全解|字符集与排序规则冲突原理、分层排错、通用解决方案(适配5.7/8.0迁移)
数据库·mysql
Lyyaoo.12 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
南城以南溫暖如初14714 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
冰之杍19 小时前
MySQL utf8mb3 → utf8mb4 完整修改方案
数据库·mysql