mysql默认只监听127.0.0.1,navicat连不上需同时修改bind-address为0.0.0.0并重启服务、授予用户@'%'权限且适配认证插件(如mysql 8.0+需设为mysql_native_password)、开放服务器及云安全组的3306端口,缺一不可。

mysql 默认只监听 127.0.0.1,Navicat 连不上不是 Navicat 的问题,而是服务端没放开——必须同时改配置、调权限、开端口,三者缺一不可。
修改 mysqld.cnf 监听地址
bind-address 控制 MySQL 接收连接的网卡,不改它,连 IP 都 ping 通也没用。
常见错误是只注释掉这行,但忘了重启服务;或写成 bind-address = 192.168.1.100 却没确认该 IP 真实存在且可路由。
正确做法:
- 打开 /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS)
- 找到 bind-address 行,改为 bind-address = 0.0.0.0 或直接注释掉整行
- 保存后执行 sudo systemctl restart mysql(或 mysqld)
给用户授权并适配认证插件(MySQL 8.0+ 必做)
GRANT 命令本身不会自动修复加密方式,MySQL 8.0 默认用 caching_sha2_password,而 Navicat 旧版只认 mysql_native_password。
只执行 GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'pwd' 会报错 2059。
必须补上认证插件切换:
- 先登录 mysql -u root -p
- 执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 再执行:FLUSH PRIVILEGES;
注意:如果用户是 'root'@'localhost',也要单独改一次,否则本地登录可能失效
开放 3306 端口并检查防火墙规则
即使 MySQL 听了所有 IP,防火墙仍可能把连接在系统层就丢弃。
不同环境命令不同,别硬套:
- CentOS 7+/Rocky:用 firewall-cmd --permanent --add-port=3306/tcp + firewall-cmd --reload
- Ubuntu:用 ufw allow 3306(确保 ufw status 显示 active)
- 云服务器(阿里云/腾讯云等):安全组里必须额外放行 3306,这个和本地防火墙无关,常被忽略
测试是否生效:从本地执行 telnet your_server_ip 3306,能连上说明端口通了
Navicat 连接时填什么才对
不是所有字段都“默认就行”: - 主机名/IP 地址:填服务器真实公网 IP,不是localhost 或内网 IP(除非你在同局域网)
- 端口:确认是 3306,有些镜像会改默认端口
- 用户名:必须是带 @'%' 权限的用户,比如 root 或你新建的 navicat_user
- 密码:用上面 ALTER USER 设置的那个,不是初始化密码
- 高级选项里勾选“使用 SSL”前先确认服务端已配 SSL,否则连不上
最常卡住的地方其实是:改了配置但没重启 mysql,或者开了端口但云平台安全组没动。这两步不验证,其他全对也白搭。











