连接远程服务器MySQL数据库,核心是解决网络可达性、账号授权和客户端工具三个环节,用DataGrip配合SSH隧道是最稳的一条路。 全程不用反复改服务器防火墙,也不用把3306端口暴露到公网,很多生产环境就是这样连的。
DataGrip连接远程服务器mysql的完整流程
先别急着打开DataGrip,我见过不少人在这一步翻车,是因为连前的信息没凑齐,你至少需要准备三样东西:服务器的公网IP、服务器的SSH登录账号和密码、MySQL里的业务账号和密码,如果你是用密钥登录服务器,那把私钥文件也找出来。
连接前需要准备的三类信息
- 服务器侧信息:公网IP、SSH端口,默认是22,如果你改过,记下实际端口。
- MySQL侧信息:数据库用户名、密码、要连接的库名(可以留空,连上后再选)。
- 网络侧信息:确认你的本机是否能访问服务器,如果服务器在国内云厂商,一般需要安全组放行22端口;如果源IP固定,直接加白名单。
这些信息准备好了,后面的操作基本就是填空。
在DataGrip中新建数据源的具体操作
打开DataGrip,右侧边栏找到Database工具窗口,点左上角的加号,选择Data Source,再选MySQL,这一步会打开一个连接配置面板,分成General和SSH/SSL两个主要区域。
General区域里这样填:
- Host:填
0.0.1,原因后面说。 - Port:填
3306,保持默认。 - User:填你的MySQL账号,比如
root或app_user。 - Password:填对应的密码。
- Database:可以暂时留空,测试连接成功后再选具体库。
重点在SSH/SSL选项卡,勾选Use SSH tunnel,然后填入服务器的公网IP、SSH端口(默认22)、服务器登录用户名和密码,如果你的服务器只允许密钥登录,把认证方式切到Key pair,选好私钥文件。
填完之后点Test Connection,如果提示需要下载驱动,点Download等它装完,等待几秒后,DataGrip会显示连接成功,这里有个细节:Host填127.0.0.1是因为SSH隧道已经把你本地的请求转发到了服务器内网,MySQL看到的连接来源是服务器本机,所以IP填本地回环地址反而更稳。
测试连接时常见的驱动问题
测试连接报错Public Key Retrieval is not allowed时,不用慌,这是在MySQL 8的caching_sha2_password认证插件下出现的典型问题,解决办法是在连接URL末尾加上allowPublicKeyRetrieval=true,或者把驱动版本升级到较新版本,行业共识认为,这是DataGrip连接MySQL 8时遇到最多的一个坑。
mysql远程连接不上的常见原因与排查
如果你按上面的流程走完,还是提示连不上,那问题基本就落在网络、授权、MySQL配置这三层里,这里把每一层的排查路径拆开讲。
网络层:端口不通还是IP不通
先确认最基本的网络可达性,在你本机打开终端,执行:
ping 服务器公网IP
能ping通说明网络链路正常,ping不通就要看服务器安全组或防火墙是否放行了ICMP,接下来测端口:
telnet 服务器公网IP 3306
如果返回Connection refused,说明MySQL端口没对外开放;如果卡住不动,可能是防火墙丢包,但需要注意,多数云厂商的安全组默认不会放行3306端口,直连测不通,不代表SSH隧道连不上。
MySQL用户授权:Host字段的坑
这是数据库连接工具使用中最容易忽视的一点,MySQL的用户表里,用户是用户名+Host组合识别的,你本地连接时用的账号,Host可能是localhost,但远程连接时MySQL会按或具体IP去匹配。
登录服务器,执行MySQL命令:
SELECT user, host FROM mysql.user;
如果看到业务账号的Host是localhost,那远程连接一定会报1130 Host is not allowed to connect,解决办法是在服务器上执行授权语句:
CREATE USER 'app_user'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON 你的库名. TO 'app_user'@'%'; FLUSH PRIVILEGES;
MySQL 8里GRANT不能再顺带创建用户,所以CREATE USER和GRANT要分开写,这一步做完,mysql远程连接不上的情况会少一大半。
配置文件:bind-address和skip-networking
MySQL默认配置文件里,bind-address如果被写成0.0.1,它只会监听本机连接,远程访问自然被挡在门外,在服务器上执行:
grep -r "bind-address" /etc/my.cnf /etc/mysql/
如果结果里有0.0.1,改成0.0.0,然后重启MySQL服务,另一处是skip-networking这个参数,一旦开启,MySQL直接不走TCP/IP协议,只允许本地socket连接,把它注释掉再重启。
认证插件不匹配
MySQL 8默认用caching_sha2_password,旧版本客户端或驱动可能不认识,如果你用老版本的mysql命令行客户端,连接时会报Authentication plugin 'caching_sha2_password' cannot be loaded,要么升级驱动,要么把账号认证改回mysql_native_password:
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
数据库连接工具选型:DataGrip、Navicat还是命令行
聊到这儿,不少朋友会纠结到底用哪个工具,我直接说结论:长期开发选DataGrip,日常运维选命令行,Windows下习惯图形界面选Navicat。
| 对比维度 | DataGrip | Navicat | mysql命令行 |
|---|---|---|---|
| 跨平台 | Win/macOS/Linux | Win/macOS | 全平台 |
| 代码提示 | 强,支持多语言 | 一般 | 无 |
| SSH隧道 | 内置,配置简单 | 内置 | 需额外用ssh命令 |
| 免费程度 | 社区版可用 | 付费 | 开源免费 |
| 适合场景 | 开发调试、写复杂SQL | 快速查看数据 | 服务器上排障 |
你问navicat连接远程mysql会不会更简单?配置逻辑完全一样,只是入口位置不同,Navicat的SSH隧道配置在连接的“SSH”选项卡里,填的内容和DataGrip几乎一致,选哪个看你的桌面环境偏好,不影响连接原理。
连接远程mysql数据库的高频问题排查
如果在服务器上一时半会儿找不到原因,也可以先用命令行验证一遍,在服务器本机执行:
mysql -u 用户名 -p -h 127.0.0.1
能连上说明MySQL服务正常,问题出在远程访问链路,连不上就直接看MySQL日志,一般在/var/log/mysql/error.log。
你还需要检查一下本机到服务器的SSH连接是否正常,SSH隧道连不上,DataGrip会一直卡在等待状态,可以先在本机单独执行:
ssh 用户名@服务器IP
确认能登进去,再回DataGrip里重试,很多情况下,mysql远程连接不上不是MySQL的问题,而是SSH账号密码错了。
DataGrip连接远程服务器mysql时常见问题
问:DataGrip连接远程服务器mysql时提示Public Key Retrieval is not allowed,怎么处理?
答:在DataGrip的连接URL末尾加上allowPublicKeyRetrieval=true,或者把JDBC驱动更新到8.0.13以上版本,根本原因是MySQL 8的默认认证插件需要先通过公钥交换获取加密密钥,客户端默认不允许这个行为。
问:mysql远程连接不上,改了bind-address还是无效,为什么?
答:先确认skip-networking没被打开,再检查云安全组是否放行了3306端口,如果用的是CentOS,还要看SELinux状态,执行getenforce,如果返回Enforcing,需要放行MySQL的3306端口,或者临时关闭SELinux测试,还有一种情况是服务器上装了多个MySQL实例,你改的配置文件不是实际运行的那个,用ps aux | grep mysqld确认进程对应的配置文件路径。
问:用Navicat还是DataGrip连接远程mysql更稳?
答:连接稳定性取决于网络环境和服务器配置,和客户端工具关系不大,DataGrip的查询控制台对复杂SQL支持更好,Navicat在表格编辑和数据导出上更直观,如果你在Windows桌面环境且更看重界面简洁,Navicat上手更快;如果长期写SQL和调试,DataGrip的代码提示更友好。
最终一句话收束:连接远程服务器MySQL数据库,优先走SSH隧道,配好MySQL用户授权,问题多半出在Host字段和防火墙规则上。 按这个顺序排查,一次通过的概率很高。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/789031.html


