如果你第一次接触数据库,大概率会被“Navicat链接”这几个字卡住。工具本身并不复杂,复杂的是它背后的一整条链路:网络能不能通、账号有没有权限、协议认不认、字符集对不对。任何一个环节出错,屏幕上就只剩一句生硬的报错,初次接触的人很容易卡半天。这篇文章想做的,就是把“用 Navicat 建立一条可用连接”这件事从头到尾拆开,讲清楚每一步填什么、为什么,以及最常见的报错到底在提示什么。适合刚从命令行转向图形化工具的人,也适合被远程连接折腾过几次的朋友。
1. 数据库连接这件事,为什么值得单独写一篇
1.1 Navicat 只是个“遥控器”,不是数据库本身
先明确一个很多人搞混的点:Navicat 不是数据库,它不会替你存数据,也不会跑定时任务。它只是一个图形化客户端,负责把你想执行的 SQL、想看的表结构、想导出的数据,翻译成对应数据库能听懂的协议,再发送过去。
你可以把它理解成遥控器。电视信号在传输时根本不认识“遥控器”这个设备,它只知道按协议收集红外信号、解码、切换频道。Navicat 做的事情类似,只是它控制的不是电视,而是 MySQL、PostgreSQL、SQL Server、Oracle 这类关系型数据库,以及部分 NoSQL 数据库。所以“Navicat 链接不上”这句话,本质上是在说:遥控器和电视之间的通信链路出了问题,而不是电视坏了,也不是遥控器本身坏了。
这个区分非常重要。很多人一报错就开始怀疑 Navicat 需要重装、需要换版本、需要开什么特殊模式,其实绝大多数问题都出在网络、端口、账号权限或驱动兼容性上。把“客户端”和“数据库服务端”分开想,排查思路会清晰很多。
1.2 “链接”这个词拆开看,其实是三件事
“链接”听起来是一个动作,实际上包含三个独立环节:网络可达、身份认证、协议匹配。
网络可达,指的是你的电脑能通过 IP 和端口找到那台数据库服务器。这一步只关心网络路径通不通,不关心你是否有权限,也不关心数据库密码对不对。端口不通时,即使账号密码完全正确,也会报连接失败。
身份认证,指的是服务器在收到连接请求后,要求你出示用户名和密码,并核对你这台机器的主机地址是否在允许名单里。这一环节最常见的报错就是Access denied。
协议匹配,指的是客户端连上之后,双方要能协商出都支持的加密方式、字符集、SQL语法版本。版本太旧的客户端连 MySQL 8 时,经常卡在这一步。
这三个环节是顺序关系:网络不通,就不会走到认证;认证不过,就不会走到协议协商。后续排查时,按这个顺序走,往往比乱试参数高效得多。
2. 动手之前先想清楚:连接类型、端口与认证方式
2.1 你要连的到底是什么数据库
Navicat 的“新建连接”菜单里能选很多数据库类型,MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite,甚至 MongoDB 和 Redis。选错类型,可能连填写界面都不一样。
以常见关系型数据库为例:
- MySQL / MariaDB:开源界最常见,PHP、Java、Python 项目里大量使用。
- PostgreSQL:功能全面、约束严格,近年来新建项目特别爱用。
- SQL Server:主要在 Windows 生态的项目里出现。
- Oracle:传统企业级系统里比较多。
选对类型后,Navicat 会加载对应的内置驱动。驱动可以理解为“翻译官”,负责把图形界面的操作转成 MySQL 或 PostgreSQL 等数据库的协议报文。内置驱动的好处是省去手动配 JDBC 或 ODBC 的麻烦,但代价是如果 Navicat 版本太旧,遇到新版数据库的认证方式,就会翻车。
2.2 端口和协议:连接失败的第一现场
每一种数据库默认监听一个固定端口。我列一下最常见的对照表:
| 数据库 | 默认端口 | 主要协议 | 常见备注 |
|---|---|---|---|
| MySQL / MariaDB | 3306 | MySQL 协议 | 改过端口的项目非常多 |
| PostgreSQL | 5432 | PostgreSQL 协议 | 新版默认支持 SSL |
| SQL Server | 1433 | TDS 协议 | 命名实例需要额外配置 |
| Oracle | 1521 | Oracle Net | 可能区分 SID 和服务名 |
| MongoDB | 27017 | MongoDB Wire Protocol | 新版有 SRV 连接方式 |
为什么端口这么重要?因为数据库服务器可能开着防火墙,也可能在云平台安全组里限制了来源 IP。默认端口如果被改了,你在 Navicat 里仍然填 3306,自然连不上。
遇到“连不上”,第一步先确认端口对不对:可以在输入主机名和端口后,先用命令行测试端口通不通。Linux/macOS 可以用telnet <主机> <端口>,Windows 可以用Test-NetConnection <主机> -Port <端口>。如果端口不通,后面的账号密码、权限配置全都是无效劳动。
2.3 认证方式:MySQL 8 和 PostgreSQL 的版本差异
网络和端口都通了,接下来就是认证。很多老项目换数据库版本后突然连不上,问题往往出在认证方式上。
MySQL 5.7 时代,默认认证插件是mysql_native_password,大多数客户端都能直接识别。MySQL 8.0 以后,默认变成了caching_sha2_password,安全性更高,但一些老版本的 Navicat、旧语言驱动无法解析,会直接报:“Authentication plugin 'caching_sha2_password' cannot be loaded”。
解决办法有两条路:升级 Navicat 到较新版本,让客户端支持新插件;或者在不那么重要的环境里把用户改回旧插件:
ALTER USER '用户名'@'主机' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;PostgreSQL 的情况类似,新版本默认使用scram-sha-256口令认证。Navicat 新版本都支持,但如果服务器配置强行要求老式md5,也要在服务器端对齐。另外 Postgres 的连接错误提示通常更啰嗦,会直接写出“password authentication failed”,字面意思就是密码不对或用户不存在,这类问题反而好查。
3. 完整走一遍 Navicat 连接 MySQL 的过程
3.1 新建连接:每一栏字段到底填什么
以 Navicat Premium 为例,打开软件后点左上角“连接”,选择 MySQL,会弹出一个连接配置窗口。我见过很多人在这个窗口里凭感觉乱填,这里逐个说清楚。
- 连接名:这个名称只保存在本地,方便你识别是哪个环境,比如“开发库-用户中心”。它不参与数据库认证,填得再花哨也不影响连接。
- 主机:填数据库服务器的 IP 或域名。如果数据库就在本机,填
localhost或127.0.0.1都行。如果数据库跑在 Docker 容器里,不要填容器的内部 IP,要填容器的宿主机 IP,或者映射到宿主机的端口。 - 端口:MySQL 默认 3306。项目如果改过端口,这里必须跟着改。
- 用户名 / 密码:这里是数据库实例里的账号,不是操作系统的账号。MySQL 用户通常长这样:
'root'@'localhost',用户名是 root,但可以限定只能从 localhost 登录。 - 保存密码:勾选后 Navicat 会把密码加密存在本机钥匙串或凭据管理器里。不勾选的话,每次打开连接都会再次输入密码。自己的电脑勾选没问题,公用电脑不建议勾。
底部还有一个“高级”区域,里面可以设置编码。MySQL 连接字符集建议直接选utf8mb4,这是目前支持中文等特殊字符最完整的字符集。很多人在 Navicat 里查询中文正常,但拿到程序里跑就乱码,往往就是连接字符集不一致。
3.2 测试连接与保存连接
字段填完后,先不要急着点“确定”。点“测试连接”,Navicat 会立刻尝试握手。如果一切正常,会弹出一个成功提示,里面通常包含数据库版本、服务器字符集等信息。
这个“测试连接”按钮很有用,它可以快速验证网络、端口、账号、密码这四个因素是否同时正确。如果测试失败,建议先解决报错再保存,因为保存一个连不上连接没有意义。
测试成功后,点“确定”,左侧连接列表里会出现你刚才填的连接名。双击它,会进入数据库对象列表,能看到库、表、视图、函数等。到这一步,一条完整的“Navicat 链接”才算真正建立。
3.3 第一次连接成功后要做的确认
连接成功不代表万事大吉。第一次进入数据库,我建议先执行三条 SQL:
SELECT VERSION(); SELECT CURRENT_USER(); SHOW DATABASES;VERSION()用来确认连到的确实是预期版本;CURRENT_USER()用来确认当前账号在你这个来源 IP 下匹配到的是哪个 MySQL 账号;SHOW DATABASES用来确认这个账号到底能看见哪些库。
这里值得多说一句:MySQL 里的同一个用户名可以在不同 host 段注册多条记录。比如root@localhost和root@'%'是两条独立账号,它们的密码可以不同,权限也可以不同。你明明在服务器上给 root 改了密码,结果远程还是用旧密码登录,很可能是因为本地连接匹配到的是root@'%'这条记录,而你在服务器上只改了root@localhost。通过CURRENT_USER()能直接看出匹配结果,省掉很多猜疑。
4. 进阶连接场景:SSH 隧道、SSL 与多环境切换
4.1 SSH 隧道:数据库端口不裸奔时的连接方式
很多公司不会把数据库端口直接暴露到公网,而是要求先登录一台跳板机,再通过跳板机访问内网数据库。这个时候,Navicat 的 SSH 隧道功能就派上用场了。
在连接配置窗口里,切换到“SSH”标签页,勾选“使用 SSH 隧道”。通常需要填这些内容:
- 主机:跳板机的公网 IP 或域名,SSH 端口默认 22。
- 用户名:跳板机上的登录用户。
- 认证方式:可以用密码,也可以选择私钥。私钥文件如果是用 OpenSSH 格式生成的,一般可以直接选;如果是 Windows 上用 PuTTY 生成的
.ppk格式,需要先转换成 OpenSSH 格式再使用。 - 此时“连接”标签页里的主机和端口,要填内网数据库的真实地址,比如数据库内网 IP 和 3306 端口。
原理其实很简单:Navicat 先和跳板机建立一条加密的 SSH 通道,然后在这条通道里继续连接内网数据库。很多人第一次配会搞反,把跳板机当数据库主机填,结果报“主机不可达”。记住一个原则:SSH 标签页填跳板机,连接标签页填数据库内网地址。
还有两个容易踩的坑。第一,SSH 私钥文件权限不能太宽松,Linux 系统会直接拒绝读取,建议权限设为 600。第二,跳板机上不需要安装 MySQL 客户端,因为 SSH 隧道只是搬运网络数据,并不承担数据库协议解析。
4.2 SSL 连接:需要证书怎么办
如果数据库服务器要求 SSL 连接,Navicat 的“SSL”标签页就派上用场。常见的模式有三种:
- 纯加密,不校验证书:适合测试环境,勾选“使用 SSL”但关闭 CA 证书校验。这种模式能防止明文传输,但无法防中间人。
- 指定 CA 证书校验服务器身份:适合需要确认对方是正经服务器的场景。
- 客户端证书 + 私钥:用于双向 TLS 认证,安全性最高,一般企业内部 GRANT 用户时也会配套发证书。
配置证书时,路径里如果有中文或空格,有些版本会读取失败。建议把证书放在纯英文路径下,再在 Navicat 里选择。
还需要知道一个小技巧:连接建立后,可以执行下面的 SQL 确认连接是否真的走了加密:
SHOW STATUS LIKE 'Ssl_cipher';如果结果为空,说明当前连接没有加密;如果返回类似TLS_AES_256_GCM_SHA384的字符串,说明 SSL 生效了。
4.3 多环境连接管理:给连接起个能看懂的名字
连接一多,左侧列表很容易变得一团乱。我见过有人把十几个环境全都叫“数据库连接1”“数据库连接2”,每次都要一个个双击试,非常耽误事。
Navicat 支持连接分组。在连接列表里右键创建组,按“开发 / 测试 / 预发 / 生产”分类,或者按项目名分类。再把连接名改成“项目-环境-用途”的格式,比如:
user-center-dev-rw:用户中心开发环境,可读写。user-center-prod-ro:用户中心生产环境,只读账号。billing-test-admin:计费系统测试环境,管理员。
另外 Navicat 支持“复制连接”,右键现有连接选择复制,然后只改主机名、端口、密码,就能快速生成一个环境变体。这个操作对多环境切换特别友好。颜色标签也可以顺手用起来:生产环境标红,测试环境标黄,开发环境标绿,这样手指和眼睛都能少遭点罪。
5. 连接失败排查:报错代码背后的真实链路
5.1 2003 Can’t connect:网络和服务的判断顺序
2003 Can't connect to MySQL server on 'xxx'是最常见的报错,看起来像是 Navicat 的问题,实际上绝大多数是网络或服务问题。
先把判断顺序理清楚:
- 数据库服务有没有启动?在服务器本机执行
mysql命令行测试,如果本机命令行都连不上,说明服务本身有问题;如果本机能连,远程连不上,才需要继续往下查。 - 服务监听的地址是不是只允许本机访问?在服务器上执行:
netstat -tlnp | grep 3306如果看到监听地址是127.0.0.1:3306,说明 MySQL 只监听了本地回环地址,远程根本无法访问。需要修改 MySQL 配置文件里的bind-address,改成0.0.0.0后重启服务。这个操作会让数据库暴露在网络上,务必配合防火墙使用。
防火墙或云平台安全组有没有放行来源 IP?Linux 上用
firewall-cmd或iptables查看,Windows 上检查入站规则,云服务器还要去控制台确认安全组配置。这一步排查时别盯着数据库看,查网络优先级更高。端口本身通不通?在本地电脑上用
telnet <主机> 3306测试。如果端口一直卡住或超时,基本可以判断是网络层问题。这时候去纠结账号密码没有任何意义。
5.2 1045 Access denied:权限和密码插件的坑
1045 Access denied for user 'root'@'你的IP' (using password: YES)出现时,网络和端口通常已经通了,说明服务器收到了请求,但认证没通过。
原因不外乎四种:
- 密码真的不对。
- 用户名不存在,或者用户名的 host 范围不包含当前来源地址。
- 账号存在,但密码插件不兼容。
- 账号被锁定或过期,这个在一些安全策略严格的环境里会出现。
遇到这个报错,先找一个能本地登录的方式进入 MySQL,然后查看用户表:
SELECT user, host, plugin FROM mysql.user WHERE user = '目标用户';如果host是localhost,你的电脑 IP 不在授权范围里,就需要创建或修改远程访问账号。比如允许某个内网网段访问:
CREATE USER 'app'@'192.168.1.%' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON biz_db.* TO 'app'@'192.168.1.%'; FLUSH PRIVILEGES;对于生产环境,我非常不建议直接给root@'%'开放远程。就算要开,也应该限制来源 IP,并且用独立业务账号替代 root。网上每天都有人扫数据库的 3306 端口,给 root 开远程等于给黑客送了个管理员入口。
5.3 2013 Lost connection:连上了又掉线
2013 Lost connection to MySQL server during query这个报错更隐蔽。它不是一开始连接失败,而是连接建立后,稍等片刻或执行大查询时断开。
常见原因有这些:
- 数据库等待超时。MySQL 的
wait_timeout默认是 8 小时,但很多云数据库会调成几分钟。你开着 Navicat 长时间不动,连接就被服务端回收了。 max_allowed_packet太小。执行大结果集查询、导入大数据时,传输包超过限制,连接会直接断开。- 网络不稳定。无线网络丢包、跨运营商线路质量差,长连接很容易被中断。
- 连接数占满。服务器
max_connections满了,新查询无法执行,表现为偶发断连。
Navicat 侧可以做的缓解措施是:在连接编辑窗口的“高级”里,调整“保持连接间隔”,让客户端每隔一段时间发一个轻量指令,避免被服务端判定为空闲。也可以勾选“自动重新连接”,这样断线后能自动恢复,减少手工重连的打断感。
数据库侧的调整要谨慎。max_connections调太高会占用大量内存,正确做法是先用SHOW PROCESSLIST查看是否存在大量 Sleep 连接,如果确实有业务代码的线程池泄漏,优先修业务,而不是无脑加大数量。
5.4 排查链路总结:一张问题定位清单
我把高频问题整理成一张表,方便你遇到报错时快速定位:
| 报错代码或片段 | 出错层级 | 首要排查动作 |
|---|---|---|
| 2003 Can’t connect | 网络 / 服务 | 检查端口连通性,检查服务监听地址 |
| 1045 Access denied | 认证 | 查看用户 host 和插件,核对密码 |
| 2013 Lost connection | 网络 / 服务 | 查看 wait_timeout、max_allowed_packet |
| 1040 Too many connections | 服务资源 | 查看连接数,处理 Sleep 会话 |
| Authentication plugin cannot be loaded | 协议 | 升级客户端,或调整用户认证插件 |
这张表是我的个人排查顺序,不一定适配所有场景,但至少能帮你少走弯路。记住大原则:先网络,后认证,再资源。
6. 连接之外的收尾建议
最后分享几个我实际用下来觉得很有帮助的小习惯。
给数据库创建远程账号时,永远用最小权限。只读账号就只给 SELECT,业务账号只给单库的增删改查,不要给全局权限。Navicat 连接列表里一旦出现足够多的账号,你会发现权限最小化能在出问题时把影响面压到最小。
连接名统一带上环境标识。开发、测试、预发、生产这四类环境,连接配置几乎一样,只有 IP、端口、账号密码不同。如果名称不统一,误连生产库的后果可能非常严重。我见过有人因为点错连接,在测试环境执行了清库操作,虽然最后恢复了,但那种紧张感没必要体验。
导出或分享连接配置时要格外谨慎。Navicat 支持将连接配置导出成.ncx文件,但如果你勾选了“保存密码”,导出的文件里会携带凭证信息。团队协作时,可以只导出不包含密码的连接配置,然后让每个人各自填自己的密码。
数据库连接是最不起眼但最影响工作效率的一环。把这些基础概念和排查顺序真正弄懂之后,后面做数据迁移、同步、可视化查询都会顺畅很多。希望这篇把“Navicat链接”从头拆到脚的记录,能帮你省下几个折腾的下午。