Navicat 16无法一键实现“定时同步+脱敏”,必须拆解为两步:脱敏需在“数据传输”的自定义查询中手动编写SQL(如手机号用CONCAT(LEFT(mobile,3),'**',RIGHT(mobile,4))),定时则依赖Windows任务计划程序调用navigator.exe执行已保存的.nsx文件,并确保明文密码、utf8mb4字符集及高权限运行。
“定时同步+脱敏”不能靠界面按钮一键完成
navicat 16 没有内置的“脱敏同步”模式,所谓脱敏必须在数据传输前或传输过程中通过 sql 层控制。界面里的「数据同步」(tools → data synchronization)只做比对与 dml 生成,不支持字段级内容替换;而「数据传输」(tools → data transfer)虽允许自定义查询,但本身不带定时能力——定时和脱敏得拆开解决。
脱敏必须用“自定义查询”在源端过滤或转换
真正可控的脱敏点在「数据传输」的表映射环节,不是同步。你得手动为每张敏感表写 SELECT 语句,把明文字段替换成脱敏逻辑:
- 手机号:用
CONCAT(LEFT(mobile, 3), '****', RIGHT(mobile, 4))替换原字段 - 身份证号:用
CONCAT(LEFT(id_card, 6), '******', RIGHT(id_card, 4)) - 邮箱:用
CONCAT(SUBSTRING_INDEX(email, '@', 1), '@xxx.com') - 注意:目标表字段类型要兼容脱敏后结果(比如原
VARCHAR(20)脱敏后仍是字符串,但若用MD5()就得确保目标列够长) - 别依赖 Navicat 的“自动类型映射”,进「调整字段映射」里手动确认每列目标类型和长度
定时只能靠系统任务调用 navigator.exe + .nsx 文件
「自动运行」功能在 Navicat 前台最小化或锁屏后大概率失效,真稳定的方式只有命令行 + 系统调度:
- 先在 GUI 中配置好带脱敏查询的「数据传输」任务,保存为 .nsx 文件(不是 .ncx 或 .profile)
- 检查该 .nsx 文件里所有连接是否没勾选 Save password,且密码已明文填入连接属性(否则
navigator.exe运行时静默失败) - Windows 下写批处理:
"C:\Program Files\PremiumSoft\Navicat Premium 16\navigator.exe" -transfer "D:\sync\prod_to_dev_anonymized.nsx" - 用 Windows 任务计划程序添加任务,务必勾选「不管用户是否登录都要运行」和「使用最高权限运行」,否则常见
Failed to load connection - 测试时先手动双击 .bat,看日志窗口是否输出「Transfer completed」,再交由计划任务
最容易被忽略的三个细节
脱敏同步失败往往不出错提示,而是数据没变、中文乱码、或部分表漏传:
- 两个连接的「高级」设置里
Character set必须都设为utf8mb4,哪怕源库是gbk,也得在自定义查询里显式CONVERT(... USING utf8mb4) - 脱敏 SQL 中用了函数如
NOW()或变量,Navicat 不解析运行时值,只会当字面量传过去——时间条件必须写死或靠外部脚本替换 - 如果目标库已有数据,又没勾选「删除目标中不存在的记录」,那脱敏后的新数据可能只是追加,旧明文还在,等于白做











