mysql升级后systemctl start mysqld卡在activating (start)状态,根本原因是type=notify未配置或失效,导致mysqld无法向systemd发送ready=1信号;需确认mysqld.service中type=notify、notifyaccess=all、timeoutstartsec=300三项正确,并检查my.cnf中无--skip-grant-tables等跳过初始化参数,同时验证pid-file路径权限及日志中的innodb初始化完成标记。

MySQL 升级后 systemctl start mysqld 卡在 activating (start) 并超时,不是 MySQL 慢了,是 systemd 没等到它“报到”——根本原因是服务类型(Type)和通知机制没对上。
为什么升级后突然超时?Type=notify 丢了或没生效
MySQL 5.7+ 默认启用 mysqld 的 systemd 通知支持(通过 sd_notify()),但前提是服务文件里必须明确写 Type=notify,且 MySQL 启动时不能跳过初始化流程。升级过程中容易发生:
- 旧版
mysqld.service文件被覆盖或残留,里面还是Type=simple或压根没写Type - 升级后配置文件(如
/etc/my.cnf)里加了--skip-grant-tables、--skip-networking等参数,导致 mysqld 不走完整初始化路径,无法发出READY=1信号 -
NotifyAccess=all缺失,systemd 无法接收 mysqld 发出的通知(尤其当 mysqld 以非 root 用户运行时)
现象就是:进程明明起来了(ps aux | grep mysqld 能看到),mysql -u root -p 也能连,但 systemctl status mysqld 死活不变成 active (running),等满 TimeoutStartSec 就报超时。
检查并修复 mysqld.service 中的关键三项
直接编辑你正在用的服务文件(通常是 /etc/systemd/system/mysqld.service 或 /usr/lib/systemd/system/mysqld.service),确保这三行存在且正确:
-
Type=notify—— 必须有,不能是simple或空着 -
NotifyAccess=all—— 否则 mysqld 以mysql用户运行时,systemd 收不到通知 -
TimeoutStartSec=300—— 升级后 InnoDB 恢复、表检查可能变长,90 秒默认值不够;设成 300 或更高,别用infinity(调试阶段除外)
改完立刻执行:systemctl daemon-reload,再 systemctl start mysqld。别跳过 daemon-reload,否则修改不生效。
确认 my.cnf 里没破坏通知链路的参数
哪怕 Type=notify 写对了,mysqld 自己不发信号也没用。以下参数会直接让 mysqld 跳过通知握手:
-
--skip-grant-tables—— 权限系统没加载,sd_notify()不触发 -
--skip-networking—— 部分版本下连 socket 初始化都省了,通知逻辑被绕过 -
socket或pid-file路径不可写(比如目录属主不是mysql)—— mysqld 卡在写 pid 文件阶段,根本走不到通知环节
检查方式:grep -E "(skip|socket|pid-file)" /data/mysql/mysql3306/etc/my.cnf,重点关注是否启用了上述跳过类参数,以及 pid-file 所在目录权限是否为 mysql:mysql 且可写。
日志才是唯一可信源,别只看 systemctl status
systemctl status mysqld 只告诉你“卡住了”,真正原因藏在两处:
-
journalctl -u mysqld.service -n 50 --no-pager—— 查 systemd 接收到的 mysqld stdout/stderr。常见线索:status=1(配置错)、status=127(找不到 mysqld)、或根本没有READY=1行 -
sudo tail -n 30 $(grep 'log-error' /data/mysql/mysql3306/etc/my.cnf | awk '{print $3}')—— 直读 MySQL 自己的日志。重点搜InnoDB initialization、Server startup complete是否出现,如果没看到,说明 mysqld 根本没跑完初始化
升级后最容易被忽略的是:新版本 mysqld 对 datadir 下文件格式、权限、甚至 SELinux 上下文更敏感。哪怕 my.cnf 没动,/var/lib/mysql 目录的属主/SELinux 标签不对,也会让 mysqld 在初始化中途静默失败——此时 journalctl 里可能只有空白或极短输出,错误全在 MySQL 自己的日志里。











