mysql 8.0 的 restart、set persist 等功能必须由 systemd 托管才能生效;若前台启动或仅用 mysqld_safe,则功能不可用,需通过 ps 查看父进程是否为 systemd,并确保 service 文件中 type=notify、execstart 正确且无 --daemonize。

MySQL 8.0 必须由 systemd 守护才能支持 RESTART、SET PERSIST 持久化生效、优雅重载等关键运维能力;前台启动或仅用 mysqld_safe 会直接导致这些功能不可用。
确认 mysqld 是由 systemd 启动而非前台/脚本方式
执行 ps -eo pid,ppid,comm,args | grep mysqld,若看到父进程(PPID)是 systemd(PID 1),且命令行含 --defaults-file=... 而非裸跑 mysqld,说明已正确托管。常见错误现象:
-
RESTART报错ERROR 1047 (08S01): Unknown command→ 进程不是由 systemd 或mysqld_safe管理 -
systemctl status mysqld显示inactive (dead)但ps aux | grep mysqld还有进程 → 手动启的,systemd 不知情 - 执行
SET PERSIST innodb_buffer_pool_size = 2G后重启服务,参数回退 → 缺少RESTART触发重载,或 service 文件未设Type=notify
必须确保:ExecStart 指向真实 mysqld 二进制,且不带 --daemonize(systemd 自己管理进程生命周期);Type 推荐设为 notify,让 mysqld 主动通知就绪状态。
service 文件中关键安全与资源限制项不能照搬模板
默认模板常忽略实际部署路径和权限约束,直接复制易导致启动失败。重点关注以下几项:
-
User和Group必须为mysql,且数据目录(如/data1/mysql/data)所有者必须匹配,否则报Errcode: 13 - Permission denied -
Environment="MYSQLD_OPTS=--defaults-file=/data1/mysql/my.cnf"中的路径需绝对、可读,且my.cnf本身权限 ≤644、属主为root:root -
ProtectHome=true会阻止读取/home/mysql/.my.cnf,若依赖该文件认证,需设为false或移出 home 目录 -
ReadWritePaths必须显式包含数据目录和日志路径(如/var/log/mysql),否则写入失败 -
LimitNOFILE建议 ≥65535,低于 5000 时高并发连接可能触发Too many open files
多实例场景下 service 文件命名与配置隔离要点
每个实例必须有独立 service 文件(如 mysqld3307.service)、独立配置文件(如 /data/3307/my.cnf)和独立数据目录。不能共用 [mysqld] 段落。
- service 文件中
ExecStart必须指定唯一--defaults-file,且该文件内必须定义port、socket、pid-file、datadir—— 这些值在不同实例间绝不允许重复 - 避免使用
mysqld_multi:MySQL 官方明确说明,在 systemd 环境下它“unnecessary”,且与RESTART、PERSIST不兼容 - 启用多个实例:分别执行
systemctl enable mysqld3307、systemctl enable mysqld3308,不要试图用一个 service 控制多个端口 - 检查冲突:启动前运行
ss -tlnp | grep ':330[78]',确认端口未被占用
开机自启失败时优先排查 journal 日志而非 systemctl status
systemctl status mysqld 只显示最后状态,掩盖真实失败原因。真正有用的线索全在 journal:
- 查最近一次启动失败详情:
journalctl -u mysqld --since "1 hour ago" -n 100 --no-pager - 典型线索包括:
Can't read dir of '/etc/my.cnf.d/' (Errcode: 13)(权限问题)、Failed at step EXEC spawning...(路径不存在或无执行权限)、mysqld: Can't create/write to file '/data1/mysql/data/ibdata1'(SELinux 或磁盘满) - 若日志里出现
TimeoutSec=300超时,大概率是mysqld卡在初始化(如innodb_redo_log_capacity过大 + 磁盘慢),需调大TimeoutSec或优化配置 - 修改 service 文件后,必须执行
systemctl daemon-reload,否则systemctl enable/start仍用旧配置
最易被忽略的是:systemd 启动 MySQL 时,my.cnf 里的 basedir 和 datadir 必须与 service 文件中 ExecStart 的路径逻辑一致;不一致会导致初始化成功但后续启动失败,且 journal 日志提示极隐晦。











