MySQL 8.0.26 TCP/IP连接root执行GRANT PROXY报访问拒绝原因咨询
问题概述
通过TCP/IP连接登录MySQL后,即使用root账号也无法执行GRANT PROXY命令;但使用UNIX socket连接MySQL时,可以成功运行该命令。核心疑问是:为何root用户通过TCP/IP连接MySQL时,执行GRANT PROXY会提示"access denied"?
复现步骤
- 首先启动一个MySQL 8.0.26容器并进入交互Bash shell:
docker run --name testmysqldeleteme --env MYSQL_ROOT_PASSWORD=123 --detach mysql:8.0.26 docker exec -it testmysqldeleteme bash
- 在交互Bash shell中执行如下命令登录MySQL:
mysql --user root --password=123 --host 127.0.0.1
- 在MySQL shell中依次执行如下命令:
-- 开启check_proxy_users功能 SET GLOBAL check_proxy_users = 1; -- 为mysql_native_password认证插件开启代理用户支持 SET GLOBAL mysql_native_password_proxy_users = 1; -- 安装MySQL no-login插件 INSTALL PLUGIN mysql_no_login SONAME 'mysql_no_login.so'; -- 创建两个测试用户 CREATE USER trevor IDENTIFIED WITH mysql_native_password BY 'Trevor123'; CREATE USER trevor_proxy IDENTIFIED WITH mysql_no_login; -- 授予代理权限 GRANT PROXY ON trevor_proxy TO trevor;
- 执行到最后一步时返回报错:
ERROR 1698 (28000): Access denied for user 'root'@'127.0.0.1'
问题原因
核心原因是MySQL中root@localhost和root@127.0.0.1是两个完全独立的用户账号,权限相互隔离:
- 使用UNIX socket连接MySQL时,系统默认匹配的是
root@localhost账号,该账号在MySQL初始化阶段就被授予了所有最高权限,包括PROXY权限的授予权限,因此可以正常执行GRANT PROXY命令。 - 使用TCP/IP指定127.0.0.1连接时,系统匹配的是
root@127.0.0.1账号,官方MySQL 8.0的Docker镜像默认不会创建该账号,就算手动创建过该账号,默认也没有分配PROXY相关的授权,因此执行操作时会触发权限不足的报错。
验证方法
登录MySQL后执行以下两条命令,即可确认当前账号的匹配情况和权限:
-- 查看当前登录的用户和实际匹配的账号 SELECT USER(), CURRENT_USER(); -- 查看当前账号的所有权限 SHOW GRANTS FOR CURRENT_USER;
对比两种登录方式的返回结果,就能明确看到两个账号的权限差异。
解决方案
- 方案1:如果需要使用TCP连接执行相关操作,可以先用UNIX socket登录
root@localhost账号,给root@127.0.0.1授予对应权限:
GRANT PROXY ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;
执行完成后,再用TCP连接的root账号就能正常执行GRANT PROXY命令。
- 方案2:本地操作优先使用UNIX socket登录,执行登录命令时不需要指定host参数,直接运行
mysql -uroot -p即可默认走socket连接,匹配权限最高的root@localhost账号。
内容的提问来源于stack exchange,提问作者user189198
相关产品推荐
相关产品推荐

