mysqld.service文件不存在是手动安装MySQL的常见问题,需手动创建该文件并确保ExecStart路径、User/Group、PIDFile与my.cnf一致,之后执行sudo systemctl daemon-reload再enable。

mysqld.service 文件根本不存在
手动编译或解压安装 MySQL(比如从官网下载 tar.gz 包)后,mysqld.service 文件不会自动生成。systemd 只会在两个固定路径查找它:/etc/systemd/system/mysqld.service(优先级高,用于自定义)和 /usr/lib/systemd/system/mysqld.service(包管理器如 yum/apt 安装时放这里)。运行以下命令确认:
ls /etc/systemd/system/mysqld.servicels /usr/lib/systemd/system/mysqld.service
如果都返回 “No such file”,那 systemctl start mysqld 必然报 Unit mysqld.service not found。此时 systemctl daemon-reload 没用——没文件 reload 也没得加载。
注意:有些教程用 mysql.service,但你执行的是 systemctl start mysqld,名字必须严格一致。查实际注册名用:systemctl list-unit-files | grep -i mysql。
ExecStart 路径或配置文件不可达
即使 mysqld.service 文件存在,如果里面 ExecStart 指向的二进制或配置文件路径错误,mysqld 进程会秒退或卡住,systemd 就一直等 READY 信号,最终超时失败。
- 检查
ExecStart中的 mysqld 路径是否存在且可执行:ls -l /usr/local/mysql8.4/bin/mysqld - 检查
--defaults-file指向的配置文件是否真实存在、可读:ls -l /data/mysql/mysql3306/etc/my.cnf - 确认配置文件里
datadir、pid-file、log-error等路径都存在,且mysql用户有权限访问(例如/var/log/mysqld.log若不存在,MySQL 默认不会自动创建,会静默失败)
启动卡在 activating 状态,实际进程已跑
常见于 Type=notify 配置下,mysqld 启动后没及时发 READY=1 信号给 systemd。典型表现是 systemctl status mysqld 显示 activating (start) 持续几十秒,然后报 timeout was exceeded,但 ps aux | grep mysqld 能看到进程已在运行、端口也监听着。
这通常是因为配置了 innodb_buffer_pool_size 过大、磁盘 I/O 慢、或某些初始化操作耗时长,而 systemd 的默认等待时间不够。临时解法是调大 TimeoutSec(比如设为 600),但更稳妥的是改用 Type=simple,让 systemd 不依赖 READY 信号:
Service] Type=simple ExecStart=/usr/local/mysql8.4/bin/mysqld --defaults-file=/data/mysql/mysql3306/etc/my.cnf
journalctl 和 error log 才是真相所在
systemctl status mysqld 只显示状态摘要,真正卡在哪,得看实时输出和 MySQL 自己写的日志。
- 盯住
journalctl -u mysqld.service -f,启动时实时滚动输出 - 同时查 MySQL 错误日志:路径由
my.cnf里的log-error决定,常见位置包括/var/log/mysqld.log、/usr/local/mysql/data/hostname.err或/var/log/mysql/error.log - 别只看最后一行;重点找带
[ERROR]的段落,比如InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size这类提示,直接指向数据文件损坏,不是重启能解决的
最常被忽略的是:error log 路径本身权限不对,MySQL 写不进去,就什么也不记——systemd 只看到超时,却看不到任何线索。

















