mysql远程访问需三步协同:1. 修改bind-address=0.0.0.0并重启服务;2. 创建专用用户(如'app_user'@'192.168.1.%')并授最小权限,执行flush privileges;3. 防火墙及云安全组放行3306端口。

配置MySQL远程访问权限需要同时完成服务端监听设置、用户权限授权和网络层放行三件事。只做其中一两步,连接大概率会失败。
修改MySQL监听地址
默认MySQL只监听本地回环地址(127.0.0.1),必须改为监听外部网络接口:
- Linux系统:编辑/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段下确认或添加:
bind-address = 0.0.0.0 - Windows系统:编辑my.ini,同样在[mysqld]段下设置bind-address = 0.0.0.0
- 修改后务必重启MySQL服务:
CentOS用systemctl restart mysqld,Ubuntu用systemctl restart mysql,Windows在服务管理器中重启
创建或修改远程访问用户
不建议直接开放root远程登录。应创建专用账户,并按需限定来源IP:
- 登录MySQL后执行(以允许192.168.1.0/24网段为例):
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!'; - 授予最小必要权限,例如仅对sales_db库的读写:
GRANT SELECT, INSERT, UPDATE ON sales_db.* TO 'app_user'@'192.168.1.%'; - 若需从任意IP连接,host可设为'%',但生产环境应避免;执行后必须刷新:
FLUSH PRIVILEGES;
开放3306端口并放行防火墙/安全组
即使数据库配置正确,网络层拦截也会导致连接超时:
- 云服务器(阿里云、腾讯云、AWS等):进入控制台→安全组→添加入方向规则,协议TCP,端口3306,源IP填具体客户端IP或网段
- Linux本地防火墙(如firewalld):
firewall-cmd --permanent --add-port=3306/tcp → firewall-cmd --reload - Ubuntu使用ufw:
ufw allow 3306/tcp
验证与常见问题
测试是否生效,推荐分步排查:
- 在客户端机器上先用telnet 服务器IP 3306确认端口可达
- 再用MySQL命令行尝试连接:
mysql -h 服务器IP -u app_user -p - 若提示“Access denied”,检查user表中对应用户的host值是否匹配实际来源IP(注意localhost和127.0.0.1也不同)
- MySQL 8.0+用户密码插件默认为caching_sha2_password,如遇认证失败,可显式指定:
ALTER USER 'app_user'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';











