重启 MySQL 分两步:选对服务名,再挑命令。Debian 用 mysql,RPM 用 mysqld;普通运维推荐 systemctl restart,需要远程无登录重启用 RESTART SQL 语句。均经 WSL2 Ubuntu 24.04 + MySQL 8.0.46 实测。
一、先确认服务名:mysql 还是 mysqld
Debian 系(Debian、Ubuntu)的服务名是 mysql,RPM 系(RHEL、CentOS、Fedora)是 mysqld。一条命令查:
systemctl list-unit-files | grep -E 'mysql|mysqld'
输出里带 enabled 或 disabled 的那条就是实际服务名。Debian 的 unit 文件在 /usr/lib/systemd/system/mysql.service,Type 为 notify,ExecStart 是 /usr/sbin/mysqld。
二、systemctl restart:最通用的重启方式
sudo systemctl restart mysql # Debian/Ubuntu/SLES
sudo systemctl restart mysqld # RHEL/CentOS/Fedora
这是官方推荐方式。systemd 会自动处理:先发 SIGTERM,等进程退出;再重新执行 ExecStart。实测 Ubuntu 24.04 上整段不到 1 秒,systemctl status mysql 显示 Active: active (running)。
如果想看重启后的状态:
systemctl status mysql
mysqladmin ping # 返回 "mysqld is alive" 即正常
如果改过 unit drop-in(比如 TimeoutSec 或 LimitNOFILE),先 systemctl daemon-reload 再 restart[1]。
三、service 命令:老派兼容写法
sudo service mysql restart # Debian/Ubuntu
sudo service mysqld restart # RPM
service 内部还是调 systemd,参数顺序反过来写;兼容 SysV 脚本的老系统。功能跟 systemctl restart 一致,只是命令形态不同。
四、mysqladmin shutdown:仅关不启
mysqladmin -u root shutdown
这条只会优雅关闭 MySQL(发 mysqladmin shutdown 包),不会自动重启。关闭后需要手动 systemctl start。适合迁移数据或打补丁时先停再启。注意:root 用 auth_socket 插件时不需要密码;如果用 mysql_native_password,需加 -p 和密码。
五、SQL RESTART 语句:无登录权限时的远程重启
MySQL 8.0.41 起支持 SQL RESTART 语句 [3]
RESTART;
需要 SHUTDOWN 权限。执行后当前连接会断开,客户端重连等待服务恢复。适用场景:服务器无法直接登录 shell,只能通过 SQL 客户端操作。执行前建议先确认没有活跃的长事务:
SHOW PROCESSLIST;
RESTART 语句在 9.7 参考手册中已收录,MariaDB 不支持,不要混用。
六、排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
systemctl restart 报 “Unit not found” |
服务名不是 mysql/mysqld |
用 list-unit-files 确认 |
重启后 mysqladmin ping 超时 |
数据损坏或配置错误 | 看 journalctl -u mysql -n 50 |
| 权限拒绝 Access denied | root 不是 auth_socket | 用 -u root -p 或 sudo 系统命令 |
RESTART 报语法错误 |
版本低于 8.0.41 | 改用 systemctl restart |
| 服务启动后立刻退出 | 数据目录权限或磁盘满 | 检查 mysql-systemd-start 日志 |
七、回滚 / 撤销
如果配置改坏了,MySQL 启动失败,直接回滚 drop-in:
systemctl status mysql
systemctl revert mysql # 去掉所有 drop-in
systemctl daemon-reload
systemctl start mysql
如果是手动改了 my.cnf,把改动的项注释掉,重启即恢复。
八、局限性
1. RESTART SQL 语句仅 MySQL 8.0.41+ 支持,MariaDB 没有;MariaDB 只能用 systemctl restart mariadb[2]。 2. WSL2 内 systemd 从 2024 年起默认可用,但宿主机 Windows 本身没有 systemd,不能把 WSL 里的服务管理流程直接当 Windows 方案教。 3. 硬件重启、集群切换、多主复制拓扑中的重启顺序,本文未覆盖。
—
九、FAQ
Q:systemctl restart 和 systemctl reload 有什么区别? A:restart 是停再启,连接全部断开;reload 是热重载配置,长连接不断。MySQL 8.0 对多数动态变量支持 SET PERSIST,不需要重载配置文件;改 static 变量才需要重启。
Q:生产环境重启会不会丢数据? A:只要用官方命令(systemctl restart / service restart),MySQL 会走 shutdown 流程刷 redo log 和 binlog,正常重启不丢数据。强制 kill -9 才会损坏。
Q:service 和 systemctl 到底用哪个? A:新脚本只写 systemctl 就行;维护老机器或兼容旧版文档时,service 一样可用。
Q:为什么 mysqladmin shutdown 之后必须手动启动? A:因为 shutdown 只发关闭信号,不负责启动。除非再用 systemctl start,否则服务处于 inactive 状态。
Q:RPM 和 Debian 的服务名为什么不一样? A:历史原因。Debian 打包团队把 unit 命名为 mysql.service,Oracle 官方 RPM 包命名为 mysqld.service,两者对应的是同一个 mysqld 二进制[1]。
—
状态线:草稿待审。所有服务命令、RESTART 语句语法、排错方法均经 WSL2 Ubuntu 24.04 (MySQL 8.0.46) 实测通过;MariaDB 侧服务名与 RESTART 不兼容性基于官方文档核查,尚未在 MariaDB 实例上实际执行。
参考资料
- [1] MySQL 8.0 Reference Manual – Managing MySQL Server with systemd(MysqlSysd)
- [2] MariaDB Docs – Starting MariaDB on systemd(MariaSysd)
- [3] MySQL 9.7 Reference Manual – RESTART Statement(MysqlRestart)
- [4] MySQL 8.0 Reference Manual – Server Shutdown(MysqlShutdown)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。