定时同步必须先保存为Profile,否则无法被计划调用;需勾选“另存为作业”,配置系统计划权限,设置时间戳锚点,并人工核对跨库类型与字符集映射。
同步任务必须先保存为 Profile,否则无法被计划调用
navicat 的「定时同步」不是直接给向导点个“立即执行”就能塞进计划里的——它依赖一个中间产物:profile(配置文件)。没保存这一步,后续所有调度设置都是空转。
- 同步向导走完后,务必在最后一步勾选 “另存为作业” 或点击
Save Profile,起个带业务含义的名字(比如mysql_to_pg_users_daily) - 这个
.nsx文件会被 Navicat 存在本地(Windows 默认在%APPDATA%\PremierSoft\Navicat\Profiles\),但你不需要手动找它——只要在「自动运行」界面能拖进去,就说明保存成功 - 常见错误:点完“开始同步”就关窗口,以为任务已注册;结果去「自动运行」里拖不到任何东西,计划永远是空的
“自动运行” ≠ “后台常驻”,它靠系统级计划服务驱动
Navicat 本身不维护守护进程。所谓“定时”,其实是它在 Windows 上创建了 Task Scheduler 任务、在 macOS 上生成 launchd plist、在 Linux 上写入 cron 条目。这意味着:
- 即使 Navicat 客户端完全关闭,同步仍会准时触发(前提是系统开机且用户已登录)
- Windows 下若计划任务显示“上次运行结果”始终是
0x1或空白,大概率是没勾选使用最高权限运行;右键任务 → 属性 → 勾上,否则可能因权限不足连数据库都连不上 - macOS/Linux 用户要注意:如果用的是非登录用户启动的 cron(如
sudo crontab -e),Navicat 的连接配置可能不可见,建议统一用当前 GUI 用户的 cron
增量同步不能只靠勾选“仅插入新记录”,得有数据锚点
Navicat 的 Insert records only 模式只是行为开关,它不会自动识别“哪些是新的”。真要增量,必须让源表自带可判定变化的字段,否则每次都会把全量当“新”插入,引发主键冲突或重复数据。
- 理想锚点是
created_at或updated_at时间戳字段,且确保它在源库中严格递增、不为空 - 在同步向导 Step 1 的
Options里,取消勾选Delete records和Update records,只留Insert records - 关键一步:点击
Filter(过滤器),写 SQL 条件,例如WHERE updated_at > ?,Navicat 会自动把上一次成功执行的时间填进去——这个机制只在保存为 Profile 后的自动运行中生效 - 没有时间戳?那就得自己加标记字段(如
is_synced TINYINT DEFAULT 0),同步后用自定义查询更新它,否则增量就是伪命题
跨库同步时,“高级选项”里的类型映射和字符集必须人工核对
Navicat 虽然宣称支持 MySQL→PostgreSQL、Oracle→SQL Server 等跨库传输,但它的自动类型转换很保守。比如 TIMESTAMP WITH TIME ZONE 到 DATETIME、JSON 字段在旧版 SQL Server 中降级成 NVARCHAR,这些都不会报错,但数据语义已丢失。
- 进入同步向导 Step 2 后,逐张表点开
Field Mapping,重点看源字段类型和目标推断类型是否一致;不一致的必须手动改目标类型(如把TEXT改成LONGTEXT) - 字符集问题高频出现在 MySQL→其他库:源库是
utf8mb4,目标库若建库时用的是UTF8(非UTF8MB4),中文或 emoji 会变?;务必在目标库连接属性里确认Character set设置 - PostgreSQL 目标库注意:Navicat 默认把 MySQL 的
INT映射为INTEGER,但如果源值超过 2147483647,就得手动改成BIGINT,否则同步失败报integer out of range










