SHUTDOWN权限必须显式授予且仅限ON .,不包含在ALL PRIVILEGES中;授予权限后需执行FLUSH PRIVILEGES,并确保用户存在、host匹配,否则执行SHUTDOWN或mysqladmin shutdown会报错。

因为 ALL PRIVILEGES 不包含 SHUTDOWN 权限 —— 这是两个独立权限,必须显式授予。
SHUTDOWN 权限不能靠 ALL PRIVILEGES 自动获得
MySQL 的 SHUTDOWN 是一个单独的全局管理权限,和 SELECT、INSERT 等数据操作权限不在同一组。即使你执行了:
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
用户依然没有 SHUTDOWN 权限。这不是遗漏或 bug,而是设计如此 —— MySQL 明确将服务控制类权限(如 SHUTDOWN、RELOAD、SUPER)与数据库对象操作权限解耦。
-
ALL PRIVILEGES只覆盖标准 DDL/DML 权限(CREATE、DROP、ALTER等),不包括服务器级操作 -
SHUTDOWN必须单独、显式授予:GRANT SHUTDOWN ON *.* TO 'admin'@'localhost'; - 漏掉
ON *.*会失败;写成ON mydb.*会报错ERROR 1221 (HY000): Incorrect usage of DBA or GLOBAL privileges
授完 SHUTDOWN 权限后仍被拒绝?检查这三点
常见现象是:用户能连上 MySQL,但一执行 SHUTDOWN; 或 mysqladmin shutdown 就报 ERROR 1045 (28000): Access denied。问题通常出在:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 没运行
FLUSH PRIVILEGES;—— MySQL 不自动重载权限表,必须手动刷新 - host 不匹配:授权的是
'admin'@'localhost',但连接时用了-h 127.0.0.1,MySQL 视为'admin'@'127.0.0.1',而该账号不存在 - 用户根本不存在就直接
GRANT:MySQL 5.7+ 默认拒绝,会报ERROR 1133 (42000): Can't find any matching row in the user table;得先CREATE USER再GRANT
mysqladmin shutdown 失败的隐藏原因
即使 SHUTDOWN 权限已正确授予,mysqladmin shutdown 仍可能失败,原因很具体:
- 用
-h localhost连接时,MySQL 默认走 socket 文件;但mysqladmin在某些环境下会解析为127.0.0.1,触发 host 不匹配 - MySQL 8.0+ 默认禁用命令行传密码(
-p),会警告并可能被审计拦截;建议改用~/.my.cnf配置凭证 -
mysqladmin shutdown本身不依赖客户端是否支持 SQL 语句,但它完全受制于服务端权限校验逻辑 —— 和直接执行SHUTDOWN;是同一套判断
最容易被忽略的点是:权限作用域必须是 *.*,且不能省略;SHUTDOWN 不接受任何数据库或表粒度的限定 —— 这不是配置疏忽,是语法强制要求。










