Navicat CLI 同步必须用 Navicat 16+ 的 navicatcli 工具,且需先在 GUI 中保存为 Profile(.nsx 文件);Linux 下须确保 crontab 使用同一用户、正确设置 PATH 和 DISPLAY,并确认配置目录权限;否则将静默失败。
Navicat CLI 命令行调用必须用 Navicat 16+,且需先保存为 Profile
linux 版 navicat 没有内置定时器,也不能像 windows 那样用 navigator.exe 直接跑同步作业。唯一可行路径是使用 navicat 16 起新增的 navicatcli 工具,但它只认「已保存的 profile」(即同步作业文件),不是 gui 里点几下就能导出的临时配置。
常见错误是:在同步向导里做完映射、测试连接成功后直接关掉,没点「另存为作业」——这样 navicatcli 执行时会报 Profile not found 或静默退出。
- 务必在同步向导最后一步勾选「另存为作业」,起个不含空格和特殊字符的名字,比如
prod_orders_sync - Profile 默认保存在
~/.navicat/Profiles/下,文件扩展名是.nsx,但路径不能硬写,得用navicatcli --list-profiles确认实际路径 - 如果用的是非 GUI 登录用户(如
sudo crontab -e),navicatcli可能读不到 Profile —— 因为它依赖当前用户的图形会话环境,建议统一用你日常登录桌面的用户执行crontab -e
crontab 中调用 navicatcli 必须显式声明 PATH 和 DISPLAY
crond 启动时用的是 minimal shell(/bin/sh),不加载 ~/.bashrc 或 ~/.profile,所以即使你在终端里能直接敲 navicatcli,放进 crontab 就会提示 command not found。
另外,navicatcli 在 Linux 上仍需访问 X11 显示服务(哪怕不弹窗),否则连接数据库时可能卡在认证或 SSL 握手阶段,日志里只显示超时。
- 在 crontab 文件顶部加两行:
PATH=/usr/local/bin:/usr/bin:/bin:/opt/navicat/binDISPLAY=:0 -
navicatcli通常装在/opt/navicat/下,用which navicatcli或find /opt -name navicatcli 2>/dev/null确认真实路径,命令必须写绝对路径,例如:/opt/navicat/navicatcli --sync "prod_orders_sync" - 加日志重定向方便排查:
0 2 * * * /opt/navicat/navicatcli --sync "prod_orders_sync" >> /var/log/navicat_sync.log 2>&1
增量同步失败常因时间戳锚点未生效或权限不足
Navicat 的「基于时间戳的增量同步」功能依赖 Profile 里设置的「锚点字段」(如 updated_at)和上次成功运行时间。这个时间由 Navicat 自己维护,但前提是:它得能写入自己的配置目录。
如果 crontab 用 root 或其他用户执行,而 Profile 存在普通用户家目录下,navicatcli 会因权限不足无法更新锚点时间,导致每次全量同步或漏数据。
- 确保 crontab 是用保存 Profile 的同一用户编辑的(
crontab -e,不是sudo crontab -e) - 检查
~/.navicat/目录权限:ls -ld ~/.navicat应显示属主是你自己,且至少有drwx------ - 若同步目标是远程数据库,确认该用户在数据库端有
SELECT(源)和INSERT/UPDATE(目标)权限;跨库类型转换(如 MySQLDATETIME→ PostgreSQLTIMESTAMP WITH TIME ZONE)需人工核对映射规则,Navicat 不自动处理时区偏移
替代方案:用 mysqldump + mysql 组合更稳定,适合纯数据级同步
如果你只是做 MySQL 到 MySQL 的全量或按表 dump,navicatcli 反而容易因 GUI 依赖和权限链过长出问题。直接用原生命令组合,crontab 调度更轻量、错误更明确。
注意:这绕过了 Navicat 的可视化映射和冲突处理逻辑,适合结构稳定、无复杂转换需求的场景。
- 写脚本
/home/user/bin/mysql_sync.sh,内容类似:mysqldump -h src_host -u user -p'pass' --single-transaction db_name table1 table2 | mysql -h dst_host -u user -p'pass' db_name - 给脚本加执行权限:
chmod +x /home/user/bin/mysql_sync.sh - crontab 里调用它即可,无需 DISPLAY 或 GUI 环境:
0 3 * * * /home/user/bin/mysql_sync.sh >> /var/log/mysql_sync.log 2>&1 - 密码明文有风险?可用
~/.my.cnf配置文件代替,但要设chmod 600 ~/.my.cnf,否则mysqldump会拒绝读取
真正卡住的往往不是语法,而是 Profile 是否存在、DISPLAY 是否可达、以及 crontab 运行用户能否访问 Navicat 的配置目录 —— 这三处不一致,navicatcli 就会安静失败,连错误日志都不留。


















