2013错误根本原因是tcp已连通但mysql未发出初始握手包;需重点检查腾讯云安全组/网络acl出站响应拦截、cdb是否开启公网访问、ssl强制要求及认证插件兼容性,而非navicat配置或版本问题。

Navicat 16 连接腾讯云 CDB MySQL 提示握手失败(错误码 2013),根本原因不是 Navicat 版本太旧或配置不对,而是 TCP 连接已建立、MySQL 协议握手包却没发出来——服务端“卡在出门前”,客户端等超时后直接断开。
检查腾讯云安全组是否静默丢弃初始包
腾讯云 CDB 的安全组默认不放行 3306 端口,且即使开了入站规则,也可能因“出站响应被拦截”导致握手失败。这不是 Navicat 的问题,是网络层单向通路造成的假连接。
- 登录腾讯云控制台 → 轻量应用服务器/云数据库 CDB 实例 → 「安全组」→ 检查入站规则:协议 TCP、端口
3306、源 IP 填你本地公网 IP(不要用0.0.0.0/0测试时可临时允许,但生产环境必须收敛) - 重点检查「网络 ACL」(如果用了 VPC):它比安全组更底层,可能默认拒绝所有非白名单出站响应
- 快速验证命令:
telnet your_cdb_ip 3306—— 若连接后立即断开或卡住不动,说明 TCP 层通但 MySQL 服务没响应;若超时,则是安全组或 ACL 阻断
确认 CDB 实例是否启用“私有网络访问”且未绑定公网IP
腾讯云 CDB 默认只绑定内网 VIP,不分配公网 IP。如果你在 Navicat 中填的是实例的「内网地址」(如 10.x.x.x 或 172.x.x.x),而本地电脑不在同 VPC 内,那根本连不到——此时报错常被误判为握手失败,实则是路由不可达。
- 进腾讯云 CDB 控制台 → 找到目标实例 → 查看「基本信息」页:确认「网络类型」是「私有网络」,且「公网地址」栏为空
- 若需从本地直连,必须开启「公网访问」(CDB 控制台 → 更多 → 公网地址 → 开启),并注意:开启后会生成独立公网 IP,且计费方式变化
- 切勿尝试用 SSH 隧道连 CDB(CDB 不提供系统 SSH 权限),这是常见误解
排查 MySQL 服务端 bind-address 和 skip-name-resolve
腾讯云 CDB 是托管服务,my.cnf 不可修改,但部分旧版 CDB 实例仍受 skip-name-resolve 影响:若该参数关闭,MySQL 会在握手阶段反向解析客户端 IP,而公网 DNS 解析失败会导致握手停滞数秒后超时。
- 无需登录服务器改配置,但可通过 SQL 查询确认:
SELECT @@skip_name_resolve;—— 返回OFF即存在风险 - 解决方案只有两个:升级 CDB 实例版本至最新小版本(如 8.0.32+),或在 Navicat 连接设置中勾选「使用 IP 地址而非主机名」(高级选项卡里)
- 注意:CDB 的
bind-address固定为0.0.0.0,不用检查此项
Navicat 16 自身的 SSL 和协议兼容陷阱
腾讯云 CDB 默认强制要求 SSL 连接(尤其新版实例),而 Navicat 16 默认不启用 SSL,且对 caching_sha2_password 插件支持不稳定——这两者叠加,会让握手卡在认证协商阶段,表现和 2013 完全一致。
- 在 Navicat 新建连接 → 「高级」选项卡 → 勾选「使用 SSL 连接」,并点击「SSL 设置」→「CA 文件」填腾讯云提供的
mysql.rds.pem(控制台 CDB 实例页 →「数据库代理」→「下载证书」) - 若仍失败,回到「常规」选项卡 → 「高级」→ 打开「允许不安全的 SSL 连接」(仅测试用)
- 若提示
2059或1251,说明是认证插件问题:需在 CDB 控制台 →「账号管理」→ 编辑用户 → 将「认证插件」改为mysql_native_password(部分 CDB 版本支持此开关)
最易被忽略的一点:腾讯云 CDB 的「连接地址」不是实例 ID,也不是内网域名,而是控制台明确标出的「连接地址」字段(形如 xxx.mysql.tencentcdb.com:3306)。填错这个,Navicat 会先做 DNS 解析再建连,中间任意环节延迟都可能触发握手超时。











