Navicat异构数据库定时迁移必须先保存为.sync文件才能复用:配置MySQL到PostgreSQL传输时需手动映射TINYINT→BOOLEAN、DATETIME→TIMESTAMP WITHOUT TIME ZONE、JSON→jsonb,勾选重置序列并禁用“创建前删除目标对象”,再拖入自动运行批处理作业,依赖系统级任务计划而非Navicat常驻进程。
数据传输必须保存为 .sync 文件才能定时运行
navicat 的自动运行功能不支持直接调用“数据传输”向导,必须先配置好迁移任务并保存为 .sync 文件,否则定时任务一触发就卡在交互界面。这不是 bug,而是设计逻辑:只有 .sync 文件才固化了字段映射、连接上下文和过滤规则。
- 配置时务必点击右下角“保存”,生成类似
mysql_to_pg_orders.sync的文件,并记清路径 - 自动运行 → 新建批处理作业 → 在“添加工作”空白区直接拖入该
.sync文件 - 拖入后双击条目,检查源/目标连接是否仍有效;若显示“连接不可用”,说明连接被删或改名,需重建连接或手动编辑
.sync - 一个批处理作业可拖多个
.sync文件,注意用“上移/下移”控制顺序——有外键依赖的表必须按依赖关系排列
字段映射不手动干预,90% 会失败
Navicat 不会自动把 MySQL 的 TINYINT(1) 当布尔值塞进 PostgreSQL 的 BOOLEAN,也不会把 DATETIME 转成 TIMESTAMP WITHOUT TIME ZONE,更不会把 JSON 映射为 jsonb。这些必须人工点开“高级→字段映射”逐项确认。
-
TINYINT→ 手动设为目标类型BOOLEAN -
DATETIME→ 改为TIMESTAMP WITHOUT TIME ZONE(避免时区偏移导致精度丢失) -
JSON字段 → 必须指定目标类型为jsonb;若已传成text,后续要用ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::jsonb转换 - 所有字段名建议提前转小写(PostgreSQL 默认大小写敏感),可用脚本批量重命名,否则查询时报 “column does not exist”
主键冲突和乱码不是传输中断,是配置遗漏
传输卡在 95% 或报 ERROR: duplicate key value violates unique constraint,大概率是因为没勾选“重置序列”;中文变问号或 emoji 乱码,则是 Navicat 没强制告诉 PostgreSQL 客户端用 UTF-8。
- 【高级】页必须勾选
Reset sequences,否则 PostgreSQL 的 serial 序列不更新,下次插入必冲突 - 若目标表已有数据,先手动执行
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table)) - 在 MySQL 连接的“高级”设置里加参数:
SET client_encoding='UTF8'(仅靠连接字符串里的client_encoding=UTF8不可靠) - 禁用
Commit every X rows,改用Commit entire table,减少事务开销
自动运行依赖系统级计划服务,不是 Navicat 常驻进程
很多人误以为 Navicat 必须开着才能跑定时任务,其实不是。自动运行背后调用的是 Windows 的“任务计划程序”、macOS 的 launchd 或 Linux 的 cron,Navicat 客户端关了也照常执行。
- 首次启用自动运行时,Navicat 会提示你授权系统服务访问权限,拒绝会导致任务静默失败
- 任务日志默认存于
%APPDATA%\PremiumSoft\Navicat\Logs\AutoRun(Windows)或~/Library/Logs/PremiumSoft/Navicat/AutoRun(macOS),出错时优先查这里 - 生产环境务必关闭“创建前删除目标对象”选项——它会执行
DROP TABLE,不是同步,是清库











