先运行systemctl list-unit-files | grep -i mysql确认服务是否注册,若无输出则说明未注册;手动创建mysqld.service需满足User/Group为mysql、ExecStart含绝对路径和--daemonize、PIDFile与my.cnf一致,且数据目录属主为mysql:mysql;之后必须依次执行daemon-reload、enable、start并用status和journalctl验证。

确认 systemd 是否识别你的 MySQL 服务名
直接运行 systemctl list-unit-files | grep -i mysql,如果返回为空,说明 systemd 根本没加载任何 MySQL 相关的 service 单元——此时 systemctl enable 必定失败,报错 No such file or directory。这不是权限或路径问题,是服务未注册的明确信号。别跳过这步去写配置文件,先验证现状。
手写 mysqld.service 必须满足的三个硬性条件
手动创建 /etc/systemd/system/mysqld.service 时,以下三点任一出错都会导致启动超时或静默退出:
-
User和Group必须设为mysql(不能是root),且该用户必须存在:id mysql应有输出 -
ExecStart必须用绝对路径,且需显式带--daemonize(否则 systemd 等不到进程 fork 完就判定失败);若my.cnf中指定了pid-file,PIDFile=行必须与之完全一致 - 数据目录(如
/usr/local/mysql/data)属主必须是mysql:mysql,否则启动时会因权限拒绝直接退出
重载、启用、启动三步缺一不可
写完 service 文件后,顺序执行以下命令,中间不能跳步:
-
sudo systemctl daemon-reload:让 systemd 重新扫描所有 unit 文件,不执行这步,enable找不到你刚写的文件 -
sudo systemctl enable mysqld:只建软链接,不启动进程,也不校验配置语法 -
sudo systemctl start mysqld:必须立刻手动启动一次,再用sudo systemctl status mysqld查看是否显示active (running),并确认日志里没有红色错误行
启动失败时最该查的 journal 日志关键词
如果 status 显示 failed 或卡在 activating,直接运行:sudo journalctl -u mysqld -n 50 --no-pager,重点盯这几类输出:
-
Address already in use→ 3306 端口被占,用sudo ss -tuln | grep :3306查 -
Permission denied或Can't create/write to log file→ 数据目录或错误日志路径权限不对 -
Failed at step EXEC spawning→ExecStart路径写错,或mysqld二进制本身不可执行(检查ls -l /usr/local/mysql/bin/mysqld)
service 文件里漏掉 Type=forking 或误写成 Type=simple 是高频隐形坑——它会让 systemd 错判进程生命周期,最终超时杀掉进程,但日志里未必明说。


















