在Ubuntu中apt安装了MySQL,手动创建了 'root'@'localhost' 并设置了密码。
CREATE USER 'root'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
然后 Navicat 使用SSH隧道连接MySQL报错 :1698 Access denied for user root@localhost

分析
查了资料发现这是 MySQL 8.0+ 在 Ubuntu(特别是 22.04/24.04) 系统中非常典型的认证问题。
-
默认安装的
mysql-server会配置root@localhost使用auth_socket插件(也叫unix_socket),而不是密码认证。 -
执行:
CREATE USER 'root'@'localhost' IDENTIFIED BY '密码';实际上 并没有覆盖原有的
root@localhost用户,而是可能创建了一个“重复”条目(但 MySQL 不允许同名用户不同插件共存),或者操作未生效。- 更重要的是:Navicat 通过 SSH 隧道连接时,虽然目标是
127.0.0.1,但 MySQL 可能仍将其视为 localhost连接(走 socket),而你的客户端(Navicat)只能提供密码,无法提供 socket 认证所需的系统凭证,导致认证失败。
- 更重要的是:Navicat 通过 SSH 隧道连接时,虽然目标是
解决步骤
-
用SSH链接上Ubuntu,用
sudo mysql免密登录 -
查看当前 root 用户的认证方式
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';会看到root@localhost为
auth_socket

- 将
root@localhost的认证方式改为mysql_native_password(兼容 Navicat)
-- 修改认证插件并设置密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
-- 刷新权限
FLUSH PRIVILEGES;
- 再次查看认证方式是否改为
mysql_native_password

- 退出MySQL(之后本地也无法使用
sudo mysql免密登录了),再用Navicat 登录应该成功了。
评论区