Navicat 17 不支持自动清理过期备份,需手动在备份脚本末尾添加 forfiles(Windows)或 find + crontab(macOS/Linux)命令实现,注意路径、权限、环境变量及 dry-run 验证。

Navicat 17 本身不提供「自动清理过期备份」功能
它连内置定时器都已移除,更不会帮你删旧文件。所谓“自动备份”只是导出脚本 + 外部调度,清理逻辑必须自己写进脚本里,或另起一个独立清理任务。你看到的“保留策略”选项(如保留最近7天)只存在于旧版 Navicat 16 及以前的图形界面中,17 版本该字段已消失——不是藏得深,是直接没了。
Windows 下必须在批处理脚本里手动加 del 命令
生成的备份脚本(比如 backup_myapp.bat)默认只做 mysqldump,不清理。你要在它末尾追加类似这样的逻辑:
- 用
forfiles删除 7 天前的 SQL 文件:forfiles /p "C:\backup" /s /d -7 /c "cmd /c del @path" - 路径必须是绝对路径,
%APPDATA%或.会失败 - 确保任务计划程序的“起始于”字段填的是脚本所在目录(如
C:\navicat_backups\),否则forfiles找不到目标目录 - 如果备份文件名含空格或中文,
@path需包双引号:"@path"
macOS/Linux 用户得靠 find + -mtime 配合 crontab
Shell 脚本里不能依赖交互式 shell 的环境变量。你在终端能跑通的命令,放进 crontab 很可能失效,因为 PATH 不同、~ 展开失败、date 格式不一致。正确写法是:
- 显式声明
PATH=/usr/local/bin:/usr/bin:/bin - 用绝对路径写备份目录:
/Users/you/backup/,别用~/backup/ - 清理命令示例:
find /Users/you/backup -name "*.sql" -mtime +7 -delete -
-mtime +7表示“修改时间超过 7 天”,注意不是“创建时间”;MySQL 备份文件的 mtime 就是 dump 完成时刻,可用
最容易被忽略的权限和路径陷阱
90% 的清理失败不是逻辑错,而是权限或路径失控:
- Windows 任务计划里没勾选“不管用户是否登录都要运行”,锁屏后
del命令根本不会执行 - Linux cron 的
$HOME不等于你的登录用户家目录,~/.pgpass或mysql_config_editor配置可能不生效,导致备份本身失败,自然轮不到清理 - Navicat 导出的脚本里若硬编码了
--password=xxx,不仅危险,还可能因密码含特殊字符(如&、^)让后续的del或find命令解析中断 - 多个备份任务共用一个清理脚本时,务必确认
find或forfiles的路径过滤精准,别误删其他项目的 SQL 文件
echo 的 dry-run 版本,确认匹配到的文件列表无误,再删。


















