MySQL 5.7 root默认仅限localhost登录,因权限表中无root@'%'记录;需用CREATE USER指定mysql_native_password插件创建远程用户,再GRANT授权、FLUSH PRIVILEGES,并将bind-address设为0.0.0.0、开放防火墙及云安全组3306端口。

MySQL 5.7 安装后 root 用户默认不能远程登录,不是配置遗漏,而是权限表里压根没这条记录——SELECT User, Host FROM mysql.user WHERE User = 'root' 结果里只有 'localhost',就说明远程连接被直接拒绝。
确认 root 的 host 限制是否为本地独占
远程连不上,第一件事不是改配置文件,而是进 MySQL 查权限表:
- 登录本机:
mysql -u root -p - 执行:
USE mysql; SELECT User, Host FROM user WHERE User = 'root'; - 如果只看到
localhost、127.0.0.1、::1,说明 root 没有远程入口,后续所有操作都建立在这个前提上
用 GRANT 创建 root@'%' 并指定认证插件
MySQL 5.7+ 不允许直接 UPDATE user SET host = '%',否则可能因认证插件不匹配导致本地也登不上。必须用 GRANT 或 CREATE USER 显式声明:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 优先执行:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; - 再授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 最后刷新:
FLUSH PRIVILEGES; - 注意:
mysql_native_password是兼容性最稳的插件;若用caching_sha2_password,旧版 Navicat、PyMySQL 会报Authentication plugin 'caching_sha2_password' cannot be loaded
检查 bind-address 是否监听外部 IP
即使权限开了,bind-address = 127.0.0.1(MySQL 5.7 默认值)会让服务只收本机 TCP 请求,外部根本连不到端口:
- 查配置位置:
grep -r "bind-address" /etc/mysql/,通常在/etc/mysql/mysql.conf.d/mysqld.cnf - 改成:
bind-address = 0.0.0.0(开发环境)或指定内网 IP(如192.168.1.100) - 切勿写成
bind-address = localhost或留空——两者都会被解析为127.0.0.1 - 改完必须重启:
sudo systemctl restart mysql,reload不生效
防火墙和云安全组是独立关卡
权限和 bind-address 都对了,但依然连不上?大概率卡在第三层:
- 本地防火墙:Ubuntu 用
sudo ufw allow 3306,CentOS 7 用sudo firewall-cmd --permanent --add-port=3306/tcp后 reload - 云服务器安全组(阿里云/腾讯云)必须手动放行 3306 端口,且规则方向选“入方向”,源 IP 可设为
0.0.0.0/0(测试用)或限定 IP 段 - 验证是否通:从远程机器执行
telnet your-server-ip 3306,能连上说明网络层已通,问题只剩权限或认证
最容易被忽略的是认证插件和 bind-address 的组合失效——改了权限却忘了改监听地址,或用了 caching_sha2_password 却没同步客户端驱动版本。每一步都得单独验证,别假设“前面没问题”。

















