mysql报错1698是因root用户绑定auth_socket插件,仅支持sudo mysql免密登录,不接受密码;需用sudo mysql进入后执行alter user 'root'@'localhost' identified with mysql_native_password by '新密码'并flush privileges。

MySQL 报错 plugin 'auth_socket' 说明 root 用户当前用的是 socket 认证,不能用密码登录 —— 必须把它切回 mysql_native_password 才能正常用 -p 密码方式登录。
为什么连不上:root 被绑定了 auth_socket 插件
Ubuntu/Debian 系统装的 MySQL 默认把 'root'@'localhost' 设为 auth_socket 插件,它跳过密码验证,只认系统用户(比如你用 sudo mysql 能进,但 mysql -u root -p 就报错)。这个插件不接受密码,所以任何输密码的操作都会失败,错误信息通常是:ERROR 1698 (28000): Access denied for user 'root'@'localhost'。
- 这不是密码错了,是认证机制根本不收密码
-
CURRENT_USER()查出来会是'root'@'localhost',但USER()可能显示'root'@'unix_socket'或类似值 - 只有
auth_socket用户才能免密用sudo mysql进去;普通用户或远程连接完全不可行
切换认证方式:先用 sudo 进去再改 plugin
你必须先绕过密码登录(靠系统权限),再执行 SQL 修改认证插件。不能直接 mysql -u root -p,得用:
sudo mysql
进去后立刻执行:
USE mysql;UPDATE user SET plugin='mysql_native_password' WHERE User='root' AND Host='localhost';FLUSH PRIVILEGES;
注意:WHERE 条件必须带 Host='localhost',否则可能误改其他 host 的 root(比如 'root'@'%');MySQL 8.0+ 推荐用 ALTER USER 替代 UPDATE,但老版本或权限受限时 UPDATE 更稳。
MySQL 8.0+ 推荐用 ALTER USER(更安全)
如果你已能以 root 身份进入(比如刚用 sudo mysql 进去),优先用:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';FLUSH PRIVILEGES;
区别在于:
-
IDENTIFIED WITH明确指定插件,BY同时设密码,一步到位 - 不用手动更新
authentication_string字段(8.0+ 已弃用PASSWORD()函数) - 如果只想换插件不改密码,写成
IDENTIFIED WITH mysql_native_password(不带BY)
改完还连不上?检查 Host 和权限刷新
改完 plugin 不生效,大概率是下面三个漏点之一:
- 没执行
FLUSH PRIVILEGES;—— 这步不是可选,是必须,否则内存里的权限缓存还是旧的 - WHERE 条件写成
User='root'却没限定Host,结果改了'root'@'127.0.0.1'或'root'@'%',而你连的是localhost(这两者在 MySQL 里不等价) - 客户端连的时候用了
127.0.0.1(TCP)而不是localhost(socket),导致匹配到另一条 root 记录,建议统一用localhost测试,或确认两条记录都改了
验证是否生效:退出重登,运行 SELECT User, Host, plugin FROM user WHERE User = 'root';,看到 plugin 列是 mysql_native_password 就对了。
最易忽略的是 Host 匹配粒度和 FLUSH PRIVILEGES 的执行时机 —— 改完不刷,等于白改;刷了但改错 Host,等于改了别人。











