mysql默认仅允许localhost连接,远程访问需授权用户host、放行防火墙、修改bind-address、适配mysql 8认证插件,并执行flush privileges生效。

MySQL 用户没开远程权限,连不上是常态
默认安装的 MySQL 只允许 localhost 连接,哪怕你用的是正确的账号密码、端口也通,Access denied for user 或 Host 'x.x.x.x' is not allowed to connect 就是典型信号。这不是密码错了,是用户记录里压根没授权这个 IP。
GRANT 语句必须指定 host,不能只写用户名
很多人执行 GRANT ALL ON *.* TO 'user' 就以为完事了,但 MySQL 的用户是 'user'@'host' 二元组,'user'@'localhost' 和 'user'@'%' 完全是两个用户。
- 开放所有 IP:用
GRANT ALL ON *.* TO 'myuser'@'%'(注意单引号和百分号) - 只放某个网段:比如内网
GRANT ... TO 'myuser'@'192.168.1.%' - 改完必须
FLUSH PRIVILEGES;,否则不生效 - 如果用户不存在,先
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';
防火墙和 bind-address 会拦截连接请求
即使权限开了,telnet your-server 3306 不通,大概率卡在这两关:
- Linux 防火墙(如
ufw或firewalld)默认拦 3306,要手动放行:ufw allow 3306 - MySQL 配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf)里bind-address = 127.0.0.1会强制只监听本地,得改成bind-address = 0.0.0.0或注释掉 - 改完配置必须重启服务:
sudo systemctl restart mysql
MySQL 8 默认认证插件变了,客户端可能不兼容
MySQL 8.0+ 新建用户默认用 caching_sha2_password 插件,老版本客户端(比如某些 Python MySQLdb、旧版 Navicat)不支持,报错类似 Client does not support authentication protocol。
- 临时解决:创建用户时指定旧插件:
CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass'; - 或者改已有用户:
ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass'; - 再执行
FLUSH PRIVILEGES;
真正麻烦的不是权限本身,而是错误信息不指向真实原因——它可能在报“密码错误”,其实问题出在 host 匹配、bind-address、防火墙或认证插件任意一环。挨个排除比猜快得多。











