当 MySQL 远程登录提示 Access denied 时,通常是由于权限配置、网络限制或账户设置问题导致的。以下是分步排查和解决方法:
- 常见错误:输入的用户名或密码错误(注意大小写、特殊字符)。
- 验证方法:
- 在本地登录 MySQL(避免远程干扰),确认密码正确:
- 若本地也无法登录,先重置密码(参考 MySQL 密码重置流程)。
- 登录 MySQL 后,查询
user 表(位于 mysql 数据库),确认用户的 Host 和 Password 是否正确:
USE mysql;
SELECT User, Host, authentication_string FROM user WHERE User = '<用户名>';
- 关键字段:
Host:需允许远程访问(如 % 表示所有主机,或特定 IP 如 192.168.1.%)。
authentication_string:密码是否正确(加密后的值)。
- 若用户无远程权限,执行授权语句(以
user 用户名、192.168.1.100 主机为例,% 表示所有主机):
GRANT ALL PRIVILEGES ON *.* TO '<用户名>'@'%' IDENTIFIED BY '<密码>' WITH GRANT OPTION;
- 刷新权限:
- 注意:避免直接授权
root 用户远程访问,建议创建专用账户(如 remote_user)。
- MySQL 配置文件(
my.cnf 或 my.ini)中,bind-address 可能限制了监听地址:
- 若值为
127.0.0.1 或 localhost,仅允许本地连接。
- 修改方法:
- 打开配置文件(通常位于
/etc/mysql/my.cnf 或 C:\Program Files\MySQL\MySQL Server X.X\my.ini)。
- 将
bind-address 改为 0.0.0.0(允许所有 IP 连接)或注释掉该行(默认注释时允许所有)。
- 重启 MySQL 服务:
- Linux(以 iptables 为例):开放 3306 端口(MySQL 默认端口):
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo service iptables save
- Windows:通过防火墙设置允许 3306 端口入站。
- 登录云服务商控制台,检查实例的安全组规则,确保入站规则允许 3306 端口来自目标 IP 或指定网段。
- 使用
telnet 或 nc 测试远程服务器的 3306 端口是否可达:
- 若提示
连接失败,说明网络或端口未开放,需排查防火墙或安全组。
- 若
user 表中 Host 为 example.com,但服务器无法反向解析该域名,会导致拒绝访问。
- 解决:将
Host 改为 %(IP 匹配)或明确的 IP 地址。
- 新版 MySQL(8.0+)默认使用
caching_sha2_password 加密,旧客户端可能不支持。
- 解决:为用户设置兼容加密方式:
ALTER USER '<用户名>'@'%' IDENTIFIED WITH mysql_native_password BY '<密码>';
FLUSH PRIVILEGES;
- 本地验证密码 → 2. 授权远程权限(
GRANT 语句)→ 3. 修改 MySQL 绑定地址 → 4. 开放防火墙 / 安全组端口 → 5. 测试网络连通性。
通过以上步骤,通常可以解决 “Access denied” 问题。若仍失败,建议查看 MySQL 错误日志(/var/log/mysql/error.log 等),获取更详细的拒绝原因。