MariaDB已授权boto@%访问test_db但本地登录报1045访问被拒绝如何排查
问题根因
- 主机通配符
%的匹配规则限制:MariaDB/MySQL 中%仅匹配所有通过TCP/IP协议发起的远程/本地连接,不覆盖通过Unix套接字(Unix Socket)发起的本地连接。本地套接字连接需要单独匹配host字段为localhost的账号,你当前仅创建了boto@%,未创建boto@localhost,默认执行mysql命令不指定连接协议时会走本地套接字,因此触发访问拒绝。
你登录后查询的user()返回boto@localhost、current_user()返回boto@%的现象,也印证了服务端识别到的连接来源是localhost,但因为没有对应localhost的账号,才降级匹配到了%的账号,符合MariaDB的用户匹配规则。 - 授权语句潜在语法问题:你提供的授权语句中使用了中文全角单引号
’,若实际执行时也使用了全角引号,会导致授权规则未正确生效,权限校验不通过。 - 用户匹配优先级问题:MariaDB的用户匹配规则是优先匹配精度更高的host值,
localhost的优先级远高于%,如果系统中存在匿名空用户''@localhost,本地登录boto账号时会优先匹配到匿名用户,密码不匹配就会报错。
排查步骤
- 验证TCP连接是否正常:执行命令
mysql -u boto -p test_db -h 127.0.0.1 --protocol=tcp,如果可以正常登录,即可确认是本地套接字匹配规则导致的问题。 - 校验授权语法与权限:重新执行英文半角引号的授权语句,刷新权限后再次尝试登录:
GRANT ALL PRIVILEGES ON test_db.* TO 'boto'@'%' IDENTIFIED BY '你的实际密码'; FLUSH PRIVILEGES;
- 排查匿名用户:执行以下命令确认是否存在匿名用户,若存在则删除后重试:
SELECT User,Host FROM mysql.user WHERE User = ''; -- 如果返回结果有''@localhost,执行删除 DROP USER ''@localhost; FLUSH PRIVILEGES;
解决方案
如果需要支持默认的本地套接字登录,直接创建对应localhost的账号并授权即可:
CREATE USER 'boto'@'localhost' IDENTIFIED BY '你的实际密码'; GRANT ALL PRIVILEGES ON test_db.* TO 'boto'@'localhost'; FLUSH PRIVILEGES;
如果不需要多维护一套账号,每次本地登录时指定走TCP协议即可:mysql -u boto -p test_db -h 127.0.0.1 --protocol=tcp
内容的提问来源于stack exchange,提问作者Inksis
相关产品推荐
相关产品推荐

