Navicat数据同步定时运行必须先保存为.sync文件:因自动运行不支持直接调用数据传输向导,仅.sync文件固化字段映射、连接上下文和过滤条件;需手动映射TINYINT→BOOLEAN、DATETIME→TIMESTAMP WITHOUT TIME ZONE、JSON→jsonb,勾选重置序列并禁用“创建前删除目标对象”,再拖入批处理作业执行。

Navicat数据同步必须用.sync文件才能定时运行
Navicat 的「自动运行」功能不支持直接调用数据传输向导,哪怕你刚配好 MySQL → PostgreSQL 迁移,点“开始”能跑通,但设成定时任务就会卡在空白界面——因为没生成 .sync 文件。这不是异常,是设计约束:只有保存后的 .sync 文件才固化了字段映射、连接上下文和 WHERE 过滤条件。
实操关键点:
- 配置完源/目标连接、表选择、高级映射后,务必点击右下角「保存」按钮,生成类似
mysql_orders_to_pg.sync的文件,并记清保存路径 - 自动运行 → 新建批处理作业 → 在空白区直接拖入该
.sync文件(不是点“添加”) - 双击拖入的条目,检查「源连接」和「目标连接」是否显示为有效状态;若提示“连接不可用”,说明连接被删或改名,需重建连接或手动编辑
.sync文件里的 connection ID - 一个批处理作业可拖多个
.sync文件,用「上移/下移」控制执行顺序——有外键依赖的表(如orders依赖customers)必须按依赖链排列
字段类型不手动映射,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 "Id" does not exist—— 可用脚本批量ALTER TABLE ... RENAME COLUMN
主键冲突、中文乱码、行数不符,全是配置遗漏
同步卡在 95% 或报 ERROR: duplicate key value violates unique constraint,大概率是没勾选「重置序列」;中文变问号或 emoji 显示为 ,是 Navicat 没强制告诉 PostgreSQL 客户端用 UTF-8;表面成功但行数少几百条,往往因大字段截断或空值处理不一致,日志里却不报错。
关键补漏操作:
- 勾选「重置序列」:否则 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」,减少事务开销和锁等待
- 迁移前开启「Log all operations to file」,日志默认存于
~/Documents/Navicat/Logs/(macOS)或%APPDATA%\PremiumSoft\Navicat\Logs\(Windows),重点搜truncated、NULL converted to empty string
同步完成后别跳过验证环节
Navicat 底部显示「completed」不代表数据一致。它不校验内容精度、不比对 JSON 解析结果、不检查时区转换后的时间值是否偏移。很多问题要等业务查不到订单、统计报表对不上才暴露。
最低成本验证方式:
- 用 SQL 直查行数:
SELECT COUNT(*) FROM source_table和SELECT COUNT(*) FROM target_table,再查差异大的字段是否含TEXT/BLOB - 抽样比对关键字段:比如
SELECT id, created_at::text, status FROM orders ORDER BY id LIMIT 10(PostgreSQL 中created_at是TIMESTAMP,转 text 可直观比对) - 大表迁移后执行
ANALYZE table_name(PostgreSQL)或UPDATE STATISTICS(SQL Server),避免执行计划劣化 - 若用于多环境同步(如 dev → test),别依赖 Navicat 定时任务长期跑——应结合 Git 管理迁移脚本,用版本工具驱动,否则某次连接失效或映射变更没人发现


















