MariaDB从10.1升级到10.9后非root用户远程访问被拒绝
排查步骤
1. 执行mysql_upgrade修复系统表结构
MariaDB跨大版本升级(10.1→10.9)后,必须运行mysql_upgrade更新系统表结构,否则新版本权限校验逻辑无法兼容旧表数据。
- 本地登录root用户执行:
mysql_upgrade -uroot -p
- 完成后重启服务:
systemctl restart mariadb
10.1到10.9的mysql.user等系统表新增了password_expired、password_last_changed等字段,旧数据目录的表结构未更新会直接导致权限校验失败,这是此类问题的最常见根源。
2. 重新设置用户密码(更新哈希格式)
MariaDB 10.4+默认使用caching_sha2_password哈希算法,10.1则用mysql_native_password。虽新版本兼容旧算法,但部分场景下旧哈希无法通过校验,重新设置密码可生成适配新版本的哈希:
- 登录本地root用户执行:
ALTER USER 'username'@'ip' IDENTIFIED BY 'your_password'; -- 若需保留旧算法,可指定: ALTER USER 'username'@'ip' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
替换username、ip、your_password为实际信息;若用户允许所有IP访问,将ip替换为%。
3. 检查用户权限条目优先级
确认是否存在更严格的host匹配条目覆盖目标用户:
- 登录root用户执行:
SELECT user, host FROM mysql.user WHERE user = 'username';
若返回多个条目(如'username'@'192.168.1.100'和'username'@'%'),MariaDB会优先匹配更精确的host。若实际连接IP未匹配到对应精确条目,会触发权限拒绝,此时可删除多余条目或调整对应权限。
4. 验证连接时的用户匹配细节
临时开启通用查询日志,查看连接时的实际用户匹配情况:
- 登录root用户执行:
SET GLOBAL general_log = 1;
尝试远程连接后,查看日志记录,确认是否是'username'@'ip'被正确识别,而非匹配到其他无效条目。
- 关闭日志:
SET GLOBAL general_log = 0;
内容的提问来源于stack exchange,提问作者Ishank Goel
相关产品推荐
相关产品推荐

