绝大多数Access denied错误并非密码错误,而是root@localhost账号不存在、认证插件(auth_socket或caching_sha2_password)不兼容,或socket文件权限问题;需先查账号与plugin,再CREATE USER或ALTER USER切换为mysql_native_password,并执行FLUSH PRIVILEGES。

绝大多数 Access denied for user 错误,不是密码错了,而是 MySQL 根本没找到匹配的账号行,或者找到了但认证插件不认你输的密码。
查清楚报错里那个 'root'@'localhost' 到底存不存在
MySQL 的用户是 User@Host 二元组,'root'@'localhost' 和 'root'@'127.0.0.1' 完全是两个账号。你执行 mysql -u root -p 默认走 Unix socket,只认 localhost 这个 host。
- 用已有管理员账号(比如
sudo mysql)登录后运行:SELECT User, Host FROM mysql.user WHERE User = 'root'; - 如果结果里没有
localhost,只有%或127.0.0.1,那连接必然失败 - 补账号:执行
CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 别忘了立即执行
FLUSH PRIVILEGES;,否则不生效
确认并切换认证插件为 mysql_native_password
MySQL 5.7(尤其 Ubuntu/Debian 包)和 8.0+ 默认把 'root'@'localhost' 的 plugin 设成 auth_socket 或 caching_sha2_password——前者压根不校验密码,后者老客户端握手会静默失败,报错仍是 Access denied。
- 查当前插件:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; - 如果是
auth_socket:说明只认系统用户身份,mysql -u root -p必然失败 - 如果是
caching_sha2_password:Navicat、HeidiSQL、旧版 PHP/Python 驱动大概率连不上 - 统一改回:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 注意:必须显式写全
'root'@'localhost',不能只写'root';密码需满足策略(如 8 位+大小写+数字+特殊字符)
检查 Unix socket 文件权限是否拦住了本地连接
mysql -u root -p 默认走 Unix socket(不是 TCP),路径通常是 /var/run/mysqld/mysqld.sock 或 /tmp/mysql.sock。如果 socket 文件权限不对(比如属主 root:root、权限 600),普通用户根本打不开,表现就是卡住或直接报 Access denied。
- 查实际路径:
mysql --help | grep "socket" - 查权限:
ls -l /var/run/mysqld/mysqld.sock - 临时调试可改权限:
sudo chmod 644 /var/run/mysqld/mysqld.sock - 同时确保目录可读:
sudo chmod 755 /var/run/mysqld
最常被忽略的是:改完 plugin 或新建账号后,漏掉 FLUSH PRIVILEGES;;还有人以为 'root'@'localhost' 和 'root'@'127.0.0.1' 是同一个账号,反复试错却没查 Host 字段。


















