MySQL 用户 host 被锁死在 localhost 是因为 'root'@'localhost' 仅支持 Unix socket 连接,不响应 TCP 请求(包括 127.0.0.1),且默认未配置监听非本地地址、未开放防火墙端口、未刷新权限或未适配认证插件。
localhost
mysql 的用户权限是按 user@host 组合判定的,'root'@'localhost' 和 'root'@'127.0.0.1' 是两个完全不同的账号。默认安装时创建的 root 用户往往只绑定了 localhost,它不接受 tcp 连接(哪怕连本机 127.0.0.1 也不行),因为 localhost 在 mysql 中特指 unix socket 连接,不是网络地址。
localhost → 走 socket 文件,绕过 TCP 栈,host 字段不匹配任何 IP127.0.0.1 或 % → 必须走 TCP,要求 MySQL 配置允许远程连接且用户 host 匹配mysql.user 表里的 host 字段为 % 不生效:没刷新权限、没考虑密码认证插件差异、没开监听跳过任意一项都可能白操作,甚至导致 root 失联。
my.cnf(或 mysqld.cnf)里有没有 bind-address = 127.0.0.1 —— 有就删掉或改成 0.0.0.0,然后重启 mysqld
sudo ufw status 或 sudo firewall-cmd --list-ports 查看UPDATE 和 FLUSH 权限?用 SELECT CURRENT_USER(); 确认你操作的是哪个 user@host
UPDATE mysql.user 改 host 的安全写法别直接 UPDATE ... SET host = '%' 全量覆盖 —— 容易误伤其他用户,且新版本 MySQL(8.0+)对 auth_plugin 敏感,localhost 用户常用 caching_sha2_password,而远程连接有时要兼容老客户端,得显式指定。
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql -h 127.0.0.1 -u root -p(强制走 TCP)常见报错如 Host 'x.x.x.x' is not allowed to connect to this MySQL server 或 Access denied for user,90% 出在下面环节。
localhost,但你只建了 'root'@'%' —— 没覆盖 localhost 场景,建议补一条 'root'@'127.0.0.1'
old_passwords,如果客户端太老(比如某些 PHP 5.6 扩展),需改认证方式:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
127.0.0.1,该用容器内网 IP 或 host.docker.internal)host 字段看着简单,实际是 socket 路径、TCP 协议栈、认证插件、网络策略四层叠加的结果。少验一层,就卡在“明明改了却无效”上。