navicat连不上mysql主因是mysql服务端未正确配置远程访问:①bind-address需设为0.0.0.0并重启服务;②须创建host匹配的用户(如'root'@'%'或具体ip)并授权;③防火墙及云安全组须放行3306端口;④mysql 8.0默认caching_sha2_password插件与旧版navicat不兼容,需alter user切换为mysql_native_password。
navicat 连不上 mysql,八成是远程连接权限没配对——不是 navicat 的问题,而是 mysql 服务端压根没允许你这个 ip 登录,或者根本没监听外部网络。
MySQL 服务是否监听外部 IP?
默认安装的 MySQL 8.0 只监听 127.0.0.1,也就是只认本机请求。Navicat 在 Windows 上连虚拟机或云服务器,走的是局域网或公网 IP,自然被拒。
- 检查命令:
sudo ss -tlnp | grep :3306,看Local Address是不是127.0.0.1:3306 - 如果是,说明必须改配置;如果不是(比如显示
0.0.0.0:3306或具体网卡 IP),跳过这步 - 修改文件:
/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address = 127.0.0.1,改成bind-address = 0.0.0.0 - 改完必须重启:
sudo systemctl restart mysql
用户账号 host 值是否匹配你的访问来源?
MySQL 认的是「用户名@host」组合,'root'@'localhost' 和 'root'@'%' 是两个完全不同的账号。查当前 root 的 host:
SELECT user, host FROM mysql.user WHERE user = 'root';
如果只看到 localhost,那从任何远程 IP 连都会报 Host 'xxx' is not allowed to connect。
- 学习环境:直接建一个
'root'@'%'(不推荐生产)CREATE USER 'root'@'%' IDENTIFIED BY 'Root@123456';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 生产环境:只放行你本地 Windows 的真实内网 IP,比如
192.168.100.1:CREATE USER 'app_user'@'192.168.100.1' IDENTIFIED BY 'StrongPass!2026';GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'192.168.100.1'; - 无论哪种,执行完必须
FLUSH PRIVILEGES;,否则不生效
Linux 防火墙是否放行了 3306 端口?
即使 MySQL 监听了 0.0.0.0 且用户权限正确,Ubuntu/CentOS 的防火墙(ufw 或 firewalld)仍可能把连接挡在系统外。
- Ubuntu 默认用
ufw:sudo ufw allow 3306/tcp,然后sudo ufw status确认输出里有3306/tcp ALLOW Anywhere - CentOS 一般用
firewalld:sudo firewall-cmd --permanent --add-port=3306/tcp,再sudo firewall-cmd --reload - 云服务器(如阿里云、腾讯云)还需额外检查「安全组」规则,确保入方向开放 TCP 3306
Navicat 连接时 Host 填什么?
别填 localhost 或 127.0.0.1——那是让你连自己电脑上的 MySQL。你要连的是 Linux 服务器,得填它的 IP。
- 虚拟机(NAT 模式):在 Ubuntu 终端运行
hostname -I,取第一个非127.0.0.1的地址,比如192.168.159.128 - 云服务器:填控制台显示的「公网 IP」或「私网 IP」(取决于你网络拓扑)
- 端口保持默认
3306,用户名密码填你上一步创建的那个账号,不是系统 root 密码 - 如果还报
10061,先在 Windows 命令行跑telnet 192.168.159.128 3306测试端口通不通;不通就回头查防火墙或 bind-address
最容易被忽略的是:MySQL 8.0 默认用 caching_sha2_password 插件,而老版本 Navicat 可能不兼容。如果连上后立刻断开或报认证失败,进 MySQL 执行:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; 再试一次。











