MySQL安装后需同步修改root密码(8.0+须用ALTER USER并指定mysql_native_password插件)与远程权限(CREATE USER+GRANT),同时将bind-address设为0.0.0.0、开放防火墙及云安全组3306端口,最后执行FLUSH PRIVILEGES。

MySQL 安装后默认的 root 用户通常无密码、且仅允许 localhost 连接。不改这两项,远程连接必然失败,本地登录也可能被拒绝(尤其 MySQL 8.0+)。必须同时处理密码和权限,缺一不可。
修改 root 密码(MySQL 5.7 与 8.0+ 差异明显)
MySQL 8.0+ 废弃了 PASSWORD() 函数,且默认认证插件是 caching_sha2_password,很多客户端(如旧版 Navicat、某些 Python 驱动)不兼容。直接用 UPDATE user SET authentication_string = ... 容易导致无法登录。
- 推荐方式(安全且兼容):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 若已用旧方式设过密码但连不上,先跳过密码验证启动:
mysqld_safe --skip-grant-tables &,再进库执行ALTER USER或SET PASSWORD - MySQL 5.7 可用:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_new_pass');,但 8.0+ 会报错 - 无论哪种方式,最后都必须执行:
FLUSH PRIVILEGES;
授予 root 远程访问权限(不是只改 host='%' 就完事)
仅把 user 表里 root 的 host 改成 % 是危险且常失效的操作——MySQL 8.0+ 的用户记录是按 user@host 组合唯一识别的,'root'@'localhost' 和 'root'@'%' 是两条独立记录。直接 UPDATE 旧记录的 host 字段,可能触发主键冲突或被忽略。
- 正确做法是显式授权新账号:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 再赋权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 如果只想允许某 IP(比如 Web 服务器),把
%换成具体地址,如'root'@'192.168.10.5' - 执行完务必
FLUSH PRIVILEGES;,否则权限不生效
bind-address 必须改为 0.0.0.0(否则网络层就拦住了)
即使权限全开,MySQL 默认配置 bind-address = 127.0.0.1 会让服务只监听回环接口,外部请求根本送不到 MySQL 进程。这个配置在配置文件里,不重启不生效。
- Linux 常见路径:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf - Windows 对应
my.ini(MySQL 安装目录下) - 找到
bind-address行,改成:bind-address = 0.0.0.0 - 保存后必须重启服务:
sudo systemctl restart mysql(Ubuntu/Debian)或sudo systemctl restart mysqld(CentOS/RHEL) - 改完可用
ss -tlnp | grep :3306确认监听的是*:3306而非127.0.0.1:3306
防火墙和云平台安全组常被忽略
本地能连、服务在监听、权限也给了,但远程还是连不上?90% 是卡在这一层。系统防火墙和云厂商安全组是两道独立关卡,都要放行。
- Linux 防火墙示例:
sudo ufw allow 3306(Ubuntu)或sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload(CentOS) - 阿里云/腾讯云/AWS:必须在控制台「安全组」中添加入方向规则,协议 TCP,端口 3306,源 IP 可设为
0.0.0.0/0(测试用)或限定 IP 段 - 测试前先用
telnet your_server_ip 3306或nc -zv your_server_ip 3306确认端口可达
实际操作中最容易卡住的,是 MySQL 8.0+ 的认证插件不匹配 + bind-address 没改 + 安全组没开这三者叠加。单独检查每一层,比反复重试更省时间。


















