Access denied是因为MySQL将localhost和127.0.0.1视为不同主机:前者走Unix socket匹配user@'localhost',后者走TCP/IP匹配user@'127.0.0.1'或user@'%';需检查mysql.user表中是否存在'root'@'localhost'记录及对应plugin(如auth_socket或caching_sha2_password),并按需执行ALTER USER修正认证方式或创建缺失用户。

mysql -u root -p 报 Access denied,但 mysql -u root -p -h 127.0.0.1 成功
这不是密码错了,是 MySQL 把 localhost 和 127.0.0.1 当作两个完全不同的 host:前者走 Unix socket,只匹配 user@'localhost';后者走 TCP/IP,匹配 user@'127.0.0.1' 或 user@'%'。查表就能验证:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果结果里有 'root'@'127.0.0.1' 却没有 'root'@'localhost',就说明问题出在这儿。
- 别指望改
'root'@'%'能解决本地登录——localhost不会匹配% - Ubuntu/Debian 默认安装会把
'root'@'localhost'的plugin设为auth_socket,它根本不验密码,只认系统用户身份 - 用
sudo mysql -u root进去后,必须显式执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';,不能 UPDATE 表
MySQL 8.0+ 连不上,但密码确认正确
大概率是 caching_sha2_password 插件不兼容。老客户端(比如旧版 PyMySQL、Navicat 15 以下、PHP 7.4 自带的 mysqlnd)压根不支持这个插件,连接时直接拒绝,连错误细节都不报。
查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root' AND host = 'localhost';
如果是 caching_sha2_password,且你没法升级客户端,就切回兼容模式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';- 注意:必须写全
'root'@'localhost',漏掉@'localhost'就会改错账号 - MySQL 5.7.6+ 不需要
FLUSH PRIVILEGES,但改完立刻生效
SELECT user, host FROM mysql.user WHERE user = 'root' 查不到 localhost 记录
说明 mysql.user 表里压根没存 'root'@'localhost' 这条记录。默认安装或重置密码时,常只建了 'root'@'127.0.0.1' 或 'root'@'%',漏掉 localhost。
通过 yarn-threads-cli 与 Threads(Meta)交互。当用户想要阅读首页动态、点赞、收藏的帖子或特定帖子时使用;查看...
用已有管理员账号(比如 root@127.0.0.1)登录后执行:
CREATE USER 'root'@'localhost' IDENTIFIED BY '你的密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;-
FLUSH PRIVILEGES;(新建用户必须刷新)
别用 INSERT INTO mysql.user 手动写——字段缺失或哈希逻辑不对会导致账号异常,MySQL 会直接拒绝该用户登录。
输对密码还报错,且 (using password: yes) 明确显示用了密码
说明 MySQL 确实尝试校验密码,但失败了。这时候重点看三件事:
-
authentication_string字段是否为空或不是标准哈希值(比如开头不是*AAB...) -
account_locked是否为Y(账户被锁) -
password_expired是否为Y(密码过期,尤其在生产环境启用了密码策略时)
查完整状态:
SELECT user, host, plugin, authentication_string, account_locked, password_expired FROM mysql.user WHERE user = 'root' AND host = 'localhost';
如果 account_locked = 'Y',执行 ALTER USER 'root'@'localhost' ACCOUNT UNLOCK;;如果 password_expired = 'Y',再执行一次 ALTER USER ... IDENTIFIED BY ... 即可重置过期状态。
真正容易被忽略的是:MySQL 认证顺序是先严格匹配 user@host 元组,再校验密码。哪怕密码完全正确,只要 host 不匹配,就不会走到密码比对那步——日志里也看不到“密码错误”,只会显示 access denied。

















