navicat 不具备自动删除物理备份文件的功能,其界面中的“清理”选项仅移除gui索引而不删除磁盘上的.nb3文件;需用windows的forfiles或powershell配合任务计划实现真实清理。
navicat 本身不提供自动清理备份文件的功能,所谓“设置清理规则”只能在 navicat 界面外完成——你必须用操作系统级工具(如 windows 的 forfiles 或 powershell)配合任务计划程序来实现。
为什么 Navicat 的“自动清理”选项是假的
Navicat 界面里任何叫“清理”“保留最近 N 个”“自动删除旧备份”的勾选项,都只影响它自己 GUI 中显示的备份记录列表(即 .nb3 文件在软件内部的索引),**完全不会删除磁盘上的物理文件**。你点掉一个条目,production_20240512.nb3 依然躺在 C:\Users\Alice\Documents\Navicat\MySQL\Servers\10.0.1.100\prod 里,占着空间。
常见错误现象:
- Navicat 日志显示 “Cleanup completed”,但磁盘空间没变化
- 手动删了 GUI 列表里的项,过两天发现同名文件又出现在目录里(其实是新备份覆盖了旧文件名,或 Navicat 重新扫描了残留)
- 误以为“备份计划里设了保留 7 天”就万事大吉,结果半年后 D 盘爆满
Windows 下用 forfiles 清理 .nb3 文件最简方案
forfiles 是 Windows 自带命令,轻量、无需安装、权限要求低,适合大多数场景。但它对路径和时间逻辑很敏感,容易踩坑:
-
/p "D:\Navicat_Backup":路径必须用英文、无空格、无中文;含「测试」「备份」等汉字会直接报错'forfiles' 不是内部或外部命令 -
/d -7不是“7 天前创建的文件”,而是“最后修改时间早于 7 天前的午夜”(例如今天是 6月5日 08:52,它删的是 5月29日 00:00 之前修改的文件) -
/s必须加:Navicat 默认按服务器+数据库分多层子目录存.nb3,不加就只扫根目录 - 首次运行务必先用
/c "cmd /c echo @path"预览,确认匹配的是你要删的文件
一个安全可用的命令示例:
forfiles /p "D:\Navicat_Backup" /s /m "*.nb3" /d -7 /c "cmd /c if @isdir==FALSE echo Deleting @path && del /q @path"
PowerShell 脚本更适合复杂环境
当你的备份路径含空格(如 C:\My Backups\)、需要精确到小时、或跨时区部署时,forfiles 就力不从心了。Get-ChildItem + Where-Object 更可靠:
- 它直接读取
$_.LastWriteTime,而 Navicat 写入.nb3后会立即更新该时间戳,和备份动作严格同步 - 支持
(Get-Date).AddHours(-168)这种精确窗口,不受午夜截断影响 - 能轻松过滤出特定命名模式:
Where-Object {$_.Name -match '^prod_.*\.nb3$'} - 任务计划中调用时,参数必须写全:
-ExecutionPolicy Bypass -File "D:\scripts\clean.ps1",否则被策略拦截静默失败
最小可用脚本片段:
Get-ChildItem "D:\Navicat_Backup\*.nb3" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | Remove-Item -Force
真正容易被忽略的三个点
一是 Navicat 备份任务和清理脚本的执行时间必须错开——比如备份设在凌晨 1:30,清理脚本至少设在 2:00 之后,否则可能删掉刚生成的新备份;二是所有脚本路径、备份路径、任务计划中“运行位置”三者必须一致,否则 forfiles 找不到目录就报错退出;三是 .nb3 文件名里的日期(如 prod_20240605.nb3)只是参考,**永远不要基于文件名解析时间来删文件**,操作系统时间戳才是唯一可信依据。











