Navicat 还原任务不支持 post-script,必须用 navicatcli 分三步串行调用:前置(如禁用外键检查)、还原、后置(如更新版本号),并用 Shell/PowerShell 控制流程与错误中断。
Navicat 还原任务本身不支持 post-script
还原任务(--restore)是原子操作,没有“完成后执行”的钩子。你在「还原备份」对话框里翻遍所有选项卡、高级设置、连接属性里的「初始化命令」,都找不到 pre/post sql 输入框——它根本不存在。误以为在连接的「高级」页设了 set foreign_key_checks = 0; 就能影响还原过程,结果发现完全没生效,这就是典型信号。
必须用 navicatcli 分三步串行调用
真正可控的方式是绕过图形界面,用命令行工具 navicatcli(Windows 下为 navicatcli.exe)把流程拆成:前置 → 还原 → 后置,并由 Shell 或 PowerShell 控制执行顺序和失败退出。
- 前置脚本(如
pre_restore.sql)只写目标库上下文安全的语句:SET FOREIGN_KEY_CHECKS = 0;、TRUNCATE TABLE logs;,避免DELIMITER或存储过程定义 - 还原命令必须单独调用:
navicatcli --restore "MyConn" "/backups/mydb_backup.sql" - 后置脚本(如
post_restore.sql)放在还原成功后执行,例如更新版本号:UPDATE version SET v = '2.1'; - 用
&&连接三步(Linux/macOS)或if ($LASTEXITCODE -eq 0) { ... }(PowerShell),任一环节失败立即中断,防止部分执行污染状态
别直接改 .sql 备份文件加前后语句
手动编辑 mydb_backup.sql,在开头塞 SET、末尾加 UPDATE,看似简单,但风险极高:
- 若前置语句出错(比如
TRUNCATE non_existent_table),Navicat 解析到错误块就中止,已导入的表不会回滚,数据库处于半脏状态 - 备份文件里混入非 DDL/DML 内容(如注释、空行、BOM 字节)可能触发解析异常,尤其 Windows 编码下容易无声失败
- 后续再做一次还原时,你忘了这层手动修改,就会重复执行后置逻辑,造成数据错乱
自动运行任务不能替代 navicatcli 流程
「自动运行」里的「运行 SQL 文件」和「还原」是两个独立任务,调度器不保证执行时序——即使你把它们加进同一个批处理作业,也不能确保 SQL 文件一定在还原之后跑。更糟的是,如果还原失败,SQL 文件仍会照常执行,后置逻辑就失去了上下文保障。
真正稳定的做法,是把三步封装成一个可执行脚本,再把它注册进系统级定时器(如 Windows Task Scheduler 或 cron),而不是依赖 Navicat 自身的自动运行服务。后者依赖 NavicatAutoRun 服务,一旦服务崩溃或权限变更,整条链就断了。











