You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8创建管理员/超级用户遇权限问题:无法授予权限

问题描述

我对在MySQL中创建超级用户的繁琐程度感到惊讶。我创建了用户'app-user-1'并设置密码,执行了以下操作,但该用户无法授予数据库权限:

创建用户并授予所有数据库权限

mysql> CREATE USER 'app-user-1'@'%' IDENTIFIED BY 'password123';
Query OK, 0 rows affected (0.34 sec)

mysql> GRANT ALL PRIVILEGES ON `%`.* TO 'app-user-1'@'%' IDENTIFIED BY 'password123';
Query OK, 0 rows affected (0.24 sec)

GRANT ALL PRIVILEGES ON `%`.* TO 'app-user-1'@'%' WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.19 sec)

但当我以该用户登录并尝试授予数据库权限时,收到错误ERROR 1044 (42000): Access denied for user ...:

mysql> SHOW GRANTS FOR 'app-user-1'@'%';
+------------------------------------------------------------------------+
| Grants for app-user-1@%                                       |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app-user-1`@`%`                        |
| GRANT ALL PRIVILEGES ON `app-db-1`.* TO `app-user-1`@`%` |
| GRANT ALL PRIVILEGES ON `%`.* TO `app-user-1`@`%`             |
+------------------------------------------------------------------------+
3 rows in set (0.19 sec)

mysql> GRANT ALL PRIVILEGES ON `app-db-1`.* TO 'app-user-1'@'%';
ERROR 1044 (42000): Access denied for user 'app-user-1'@'%' to database 'app-db-1'

mysql> GRANT ALL PRIVILEGES ON `%`.* TO 'app-user-1'@'%' WITH GRANT OPTION;
ERROR 1044 (42000): Access denied for user 'app-user-1'@'%' to database '%'

mysql> GRANT ALL PRIVILEGES ON *.* TO 'app-user-1'@'%' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'app-user-1'@'%' (using password: YES)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'app-user-1'@'%';
ERROR 1045 (28000): Access denied for user 'app-user-1'@'%' (using password: YES)

mysql> GRANT ALL PRIVILEGES ON `%`.* TO 'app-user-1'@'%';
ERROR 1044 (42000): Access denied for user 'app-user-1'@'%' to database '%'

请问我遗漏了什么?


问题原因及解决方法

核心问题

  1. 通配符使用错误:你用了%作为数据库名的通配符,但MySQL中%被反引号包裹后是字面量数据库名,不是通配符。正确的全局权限通配符是*.*,而非%.*。
  2. WITH GRANT OPTION未生效:你执行的第三条GRANT语句没有mysql>提示符,大概率没在MySQL命令行中执行成功,导致用户没有获得授予权限的权限。
  3. 重复授权冲突:多次错误的授权操作导致权限规则混乱,干扰了正常的权限匹配逻辑。

解决步骤

  1. 删除现有用户(以root或超级用户身份登录):
DROP USER 'app-user-1'@'%';
FLUSH PRIVILEGES;
  1. 重新创建用户并授予正确权限:
CREATE USER 'app-user-1'@'%' IDENTIFIED BY 'password123';
-- 授予全局所有权限,并允许该用户给其他用户授权
GRANT ALL PRIVILEGES ON *.* TO 'app-user-1'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
  1. 验证权限:
    以app-user-1登录后,执行以下命令确认权限:
SHOW GRANTS FOR 'app-user-1'@'%';

正常输出应包含:

GRANT ALL PRIVILEGES ON *.* TO `app-user-1`@`%` WITH GRANT OPTION
  1. 测试授权操作:
    尝试执行授权命令,比如:
GRANT ALL PRIVILEGES ON `app-db-1`.* TO 'test-user'@'%';

此时不会再出现权限错误。

补充说明

  • MySQL中,*.*代表所有数据库的所有对象,是正确的全局权限通配符;
  • WITH GRANT OPTION是让用户拥有授予权限的关键,必须在初始授权时明确指定;
  • 执行FLUSH PRIVILEGES会强制MySQL重新加载权限表,确保权限立即生效。

内容的提问来源于stack exchange,提问作者uberrebu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:45:39