
之前我们进行MySQL8.4的部署,可以参考历史文章
别再yum装MySQL了!教你大厂级部署法部署MySQL8.4,实测无坑,可无脑照抄
最后的部分我们使用服务的方式进行数据库的启停操作,今天有小伙伴在部署的时候出现了"诡异的一幕",启动的时候一直没有返回(据说已经试了2天了,其他版本都正常,当前这个集群一直异常,一度怀疑是服务器问题,不禁想起一位故人)。再一查,MySQL服务明明已经启动,可以正常连接和使用,但systemctl却报告启动超时。经过远程查看后,发现了问题的根源。今天我们就来复现一下此问题,也给其他小伙伴参考。
一、 正常情况
用我们之前部署的MySQL8.4举例,部署的mysqld服务步骤如下:
1. 配置服务
创建服务文件 /etc/systemd/system/mysqld.service,添加如下内容
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=notify
ExecStart=/usr/local/mysql8.4/bin/mysqld --defaults-file=/data/mysql/mysql3306/etc/my.cnf
TimeoutSec=300
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
[Install]
WantedBy=multi-user.target
2. 重载服务
systemctl daemon-reload
systemctl enable mysqld3. 启动数据库
systemctl start mysqld
systemctl status mysqld
启动数据库后,数据库日志文件如下:

数据库也能正常登录

二、 本次异常情况
1. 异常现象
前面的配置过程都一样,启动服务时一直没返回启动结束,直到达到超时时间(上面脚本里可以看出,配置的超时时间是TimeoutSec=300,即300s),然后报错:
[root@alidb ~]# systemctl start mysqld
Job for mysqld.service failed because a timeout was exceeded. See "systemctl status mysqld.service" and "journalctl -xe" for details.

查看服务状态,显示starting
[root@alidb ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
Loaded: loaded (/etc/systemd/system/mysqld.service; bad; vendor preset: disabled)
Active: activating (start) since Mon 2026-02-02 20:08:12 CST; 4min 24s ago
Main PID: 19413 (mysqld)
CGroup: /system.slice/mysqld.service
└─19413 /usr/local/mysql5.7/bin/mysqld --defaults-file=/data/mysql/mysql3307/etc/my.cnf
Feb 02 20:08:12 alidb systemd[1]: Starting MySQL Server...
查看数据库进程,数据库进程确实正常运行着。

且可以正常访问

日志也显示正常:

虽然看上去是不影响正常使用,但是启动时一直等待的状态,无法直接判断是否正常启动完毕了。
2. 原因分析
经过对比发现,这位小伙伴用的是MySQL5.7(原因是给原先的单节点的主库加从节点),从数据库的日志可以看出,MySQL8.4和MySQL5.7 有着细微差别,即反馈的信号不太一样。
因此,针对MySQL5.7 的版本,我做了一下调整,调整后的服务配置如下:
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=forking
ExecStart=/usr/local/mysql5.7/bin/mysqld --defaults-file=/data/mysql/mysql3307/etc/my.cnf --daemonize
TimeoutSec=300
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
[Install]
WantedBy=multi-user.target
这次秒回结果,如下

其中的关键调整点就如下2个:
如果更严谨一点,可以考虑再加上PIDFile参数,便于找到对应的进程号。
三、 结语
MySQL服务启动超时问题看似简单,实则涉及systemd工作机制、MySQL版本特性等多方面知识。作为一名DBA,理解这些底层原理至关重要。如果大家下次遇到类似问题,不妨先检查MySQL版本与service配置的匹配性,这可能会帮你节省大量排查时间。运维之道,在于深入理解系统运作机制,而非仅仅记忆解决方案。
你是否在MySQL运维中遇到过其他有趣的问题?欢迎在留言区分享你的经历和解决方案!
关注微信公众号「数据库干货铺」,获取更多数据库运维干货。