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 '%'
请问我遗漏了什么?
问题原因及解决方法
核心问题
- 通配符使用错误:你用了
%作为数据库名的通配符,但MySQL中%被反引号包裹后是字面量数据库名,不是通配符。正确的全局权限通配符是*.*,而非%.*。 WITH GRANT OPTION未生效:你执行的第三条GRANT语句没有mysql>提示符,大概率没在MySQL命令行中执行成功,导致用户没有获得授予权限的权限。- 重复授权冲突:多次错误的授权操作导致权限规则混乱,干扰了正常的权限匹配逻辑。
解决步骤
- 删除现有用户(以root或超级用户身份登录):
DROP USER 'app-user-1'@'%'; FLUSH PRIVILEGES;
- 重新创建用户并授予正确权限:
CREATE USER 'app-user-1'@'%' IDENTIFIED BY 'password123'; -- 授予全局所有权限,并允许该用户给其他用户授权 GRANT ALL PRIVILEGES ON *.* TO 'app-user-1'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 验证权限:
以app-user-1登录后,执行以下命令确认权限:
SHOW GRANTS FOR 'app-user-1'@'%';
正常输出应包含:
GRANT ALL PRIVILEGES ON *.* TO `app-user-1`@`%` WITH GRANT OPTION
- 测试授权操作:
尝试执行授权命令,比如:
GRANT ALL PRIVILEGES ON `app-db-1`.* TO 'test-user'@'%';
此时不会再出现权限错误。
补充说明
- MySQL中,
*.*代表所有数据库的所有对象,是正确的全局权限通配符; WITH GRANT OPTION是让用户拥有授予权限的关键,必须在初始授权时明确指定;- 执行
FLUSH PRIVILEGES会强制MySQL重新加载权限表,确保权限立即生效。
内容的提问来源于stack exchange,提问作者uberrebu
相关产品推荐
相关产品推荐

