内网数据库连不上公网目标需先验证三件事:一、telnet测试云数据库端口是否可达;二、确认目标用户已授权该内网ip访问;三、navicat连接中启用require ssl且保存密码。
内网数据库连不上公网目标?先确认连接可达性而非直接开同步
navicat 的 data synchronization 功能本身不解决网络连通问题,它只在连接成功后比对和执行 sql。常见错误是:内网开发机配好本地 mysql 连接,目标选了公网云数据库(如阿里云 rds),点“compare & preview”直接卡住或报 connection refused (111)。
必须前置验证三件事:
- 内网机器能
telnet rds-mysql.example.com 3306通——若不通,说明云数据库安全组没放行该内网出口 IP - 目标数据库用户已授权来自该内网 IP 的访问:
GRANT SELECT, INSERT, UPDATE, DELETE ON target_db.* TO 'sync_user'@'10.20.30.40'; - Navicat 连接配置中未勾选
Save password(命令行调用时凭据不可读),且 SSL 选项设为Require SSL(公网场景必须启用)
同步时字段乱码或中文变问号?字符集必须显式对齐
即使源库和目标库都显示 utf8mb4,Navicat 同步仍可能因连接层字符集未生效导致乱码。这不是结构同步的问题,而是数据传输通道的编码协商失败。
解决方案要同时改两处:
- 在 Navicat 目标连接的
Connection Properties → Advanced中,手动填写init command:SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; - 确保目标库表级字符集也是
utf8mb4:SHOW CREATE TABLE target_table;检查DEFAULT CHARSET=utf8mb4,否则同步时插入会截断或转义 - 避免依赖客户端自动推导——Navicat GUI 不会把连接配置里的字符集透传到同步会话,必须靠
init command强制
想加密传输但又不想改数据库配置?用 SSH 隧道替代公网直连
直接让 Navicat 走公网 SSL 连 RDS,虽加密但暴露端口、依赖云厂商证书链,且部分企业防火墙会拦截非标准端口。更稳妥的做法是:把公网数据库“拉进内网”。
操作路径是建一条反向 SSH 隧道:
- 在公网 RDS 所在 ECS 上运行:
ssh -R 3307:127.0.0.1:3306 user@inner-jump-server(需提前配好免密登录) - 在内网跳板机(
inner-jump-server)上,Navicat 新建连接,主机填127.0.0.1,端口填3307,其他参数照旧 - 此时所有同步流量走 SSH 加密通道,Navicat 不感知外网,也不用配 SSL 证书或处理
X-Forwarded-Proto类问题
注意:隧道需常驻,建议用 autossh 守护;且跳板机与内网开发机必须在同一局域网段,否则 Navicat 无法解析 127.0.0.1:3307。
同步脚本跑一半中断?别信“Continue on error”,得看错在哪一层
在 Compare & Preview 界面勾选 Continue on error,只对 DML 级错误有效(比如某行唯一键冲突),但对以下两类失败完全无效:
- 连接级失败:如 SSH 隧道断开、SSL 握手超时、目标库 OOM kill 连接——整个同步流程立即终止
- 权限级失败:目标用户缺
DROP权限却启用了Delete records,报ERROR 1142 (42000): DROP command denied,不会跳过
真正可控的容错方式是分表同步 + 保存 profile:users 表单独存一个 .nsx,orders 表另存一个,出错只重跑单个文件,而不是赌 Continue on error 能兜住所有异常。











