确认 MySQL 服务已运行且本地可登录
远程访问失败,往往不是权限问题,而是 MySQL 根本没起来,或者你连本地都登不进去。先用
mysql -u root -p尝试登录,输入密码后能进命令行才算基础正常。如果报错
Can't connect to local MySQL server,说明服务未启动,需先执行
sudo systemctl start mysqld(CentOS/RHEL)或
sudo service mysql start(Ubuntu/Debian)。
修改 root 用户的 host 值为 % 或指定 IP
MySQL 的用户权限由
user表中的
host字段控制,默认安装后
root@localhost只允许本机连接。远程访问需要新增或更新一条记录,让 root(或其他用户)能从非本地地址登录。
登录 MySQL 后执行:
USE mysql; UPDATE user SET host='%' WHERE user='root' AND host='localhost'; FLUSH PRIVILEGES;
⚠️ 注意:
host='%'表示允许任意 IP 连接,生产环境建议替换为具体 IP,如
'192.168.1.100';如果该记录不存在,应改用
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password';+
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';。
检查并关闭防火墙或放行 3306 端口
即使 MySQL 允许远程连接,系统防火墙也可能拦截 3306 端口。常见错误是「能 ping 通服务器,但 telnet ip 3306 超时」。
CentOS 7+/RHEL:运行sudo firewall-cmd --permanent --add-port=3306/tcp,再
sudo firewall-cmd --reloadUbuntu/Debian(ufw):执行
sudo ufw allow 3306云服务器(如阿里云、腾讯云):还需在安全组中手动添加入方向规则,开放 TCP:3306
验证端口是否监听:运行
sudo netstat -tlnp | grep :3306,输出中应含
0.0.0.0:3306或
*:3306;若只显示
127.0.0.1:3306,说明 MySQL 绑定到了本地回环,需修改配置文件。
确认 bind-address 配置未限制监听范围
MySQL 默认可能只监听
127.0.0.1,导致即使开了远程权限也无法响应外部请求。检查配置文件(通常为
/etc/my.cnf或
/etc/mysql/mysql.conf.d/mysqld.cnf)中的
bind-address设置:
[mysqld] bind-address = 0.0.0.0
改成
0.0.0.0表示监听所有 IPv4 接口;设为
::则同时监听 IPv6;注释掉该行有时也生效,但显式声明更可靠。改完必须重启服务:
sudo systemctl restart mysqld。
实际调试时最容易漏掉这一项——权限、密码、防火墙全对,就卡在 bind-address 没放开。
