Linux中查shutdown触发时间点需结合last -x|grep shutdown和/var/log/messages日志,重点分析shutdown前后几行的[Note]/[Warning]记录,如“Shutting down”“Received signal 15”,并排查外部kill、mysqladmin shutdown或平台强制重启等操作。

查错误日志确认 shutdown 触发时间点
这个错误本身不说明“为什么关”,只说明“正在关的过程中被中断了”。真正线索在错误日志里,尤其是 shutdown 开始前后的几行。重点找 [Note] 或 [Warning] 级别中带 Shutting down、Received signal 15、mysqld_safe caught signal 的记录。
常见日志路径:
-
/var/log/mysqld.log(CentOS/RHEL yum 安装) -
/var/log/mysql/error.log(Ubuntu/Debian apt 安装) - 容器环境:直接
docker logs <container_id></container_id>,或看stdout输出
如果日志里紧跟着出现 InnoDB: FTS optimize thread exiting 或 Plugin 'innodb' deinitialized,说明 shutdown 流程已进入后期,大概率是外部强制干预导致的异常中止。
检查是否有外部 kill 或 mysqladmin shutdown 操作
MySQL 正常 shutdown 是优雅的,会等事务提交、刷盘、释放资源。如果中途退出,往往是因为被外部信号打断。排查方式:
- 执行
ps aux | grep mysqld,看进程启动时间是否和 shutdown 时间接近——如果是刚启就崩,大概率配置或磁盘问题;如果是运行数小时后崩,优先查人为操作 - 查系统命令历史:
last -a | head -20或journalctl -u mysqld --since "2 hours ago",留意systemctl stop mysqld、kill -15、mysqladmin -u root -p shutdown等记录 - 检查监控告警或运维平台——有些自动化脚本会在 CPU >95% 或连接数超限时自动触发
mysqladmin shutdown
特别注意:RDS 环境下,Server shutdown in progress 常由平台侧主动重启引发(如内核升级、主备切换),此时日志里通常能看到 Received SIGTERM from mysqld_safe 或类似提示。
确认是否因崩溃后残留进程导致二次 shutdown 失败
MySQL 崩溃后,有时 mysqld 进程没了,但 mysqld_safe 还在尝试拉起,或残留 socket 文件、PID 文件未清理。这时再执行 mysqladmin shutdown 就会卡在 Server shutdown in progress ——因为服务其实在“假死”状态,既没完全起来,也没彻底退出。
验证方法:
- 检查 PID 文件是否存在且内容有效:
cat /var/run/mysqld/mysqld.pid,再用ps -p <pid></pid>确认进程是否真在运行 - 检查 socket 文件:
ls -l /var/run/mysqld/mysqld.sock,若存在但无对应进程,多半是上次异常退出遗留 - 手动清理:
rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock,再试systemctl start mysqld
注意:不要直接 kill -9,尤其当 InnoDB 正在刷脏页时,强杀可能损坏表空间。先等 mysqladmin shutdown 超时(默认 60 秒),再考虑 kill。
排查磁盘满、OOM killer 干预等底层资源问题
系统级异常也会表现为 shutdown 卡住。比如:
- 磁盘写满:InnoDB 日志无法 flush,shutdown 阻塞在
log_write_up_to阶段;用df -h检查datadir和tmpdir所在分区 - 内存不足触发 OOM killer:
dmesg -T | grep -i "killed process" | grep mysqld,若看到Out of memory: Kill process mysqld,说明不是 MySQL 主动 shutdown,而是被系统干掉的 - SELinux/AppArmor 拦截:
ausearch -m avc -ts recent | grep mysqld,若发现拒绝写日志或删 socket 的 AVC 拒绝日志,需临时setenforce 0测试
这类问题不会在 MySQL 错误日志里留下清晰 shutdown 记录,必须跳出 MySQL 查系统层日志。最省事的方式是:先 tail -f /var/log/messages 和 tail -f /var/log/mysqld.log 一起看,对比时间戳找同步异常点。


















