navicat 不支持自动清理旧备份,需借助外部脚本实现:windows 用 powershell 按修改时间删除(如 adddays(-7)),linux/macos 用 find -mtime +7;务必先预览再执行删除,并抽样验证备份可恢复性。
navicat 本身不提供“保留最近 n 天”的自动清理功能,所有备份文件都会一直存留,必须靠外部脚本 + 系统定时任务实现。
Navicat 备份任务里找不到“保留天数”设置项
你在 Automated Backup 或计划任务的高级选项中翻遍所有配置,都不会看到类似 Keep last 7 days、Auto-delete old backups 这类开关——这不是你漏看了,是 Navicat 根本没实现这个功能。
它只管生成文件(比如 backup_202607201430.sql 或 prod_db_20260725.nb3),不管后续生命周期。文件写入后,归属、时间戳、命名规则全由操作系统决定,Navicat 不干预。
- 勾选“覆盖同名文件”只影响单次执行,无法解决历史文件堆积
- 日志清理设置(
Tools → Options → Logging)和备份文件完全无关 - 压缩选项(
Compress backup file)只是改变输出格式,不附带清理逻辑
Windows 下用 PowerShell 脚本按修改时间删旧文件最可靠
PowerShell 原生支持日期计算,对中文路径、空格、特殊字符兼容性好,比 forfiles 更稳。
示例脚本(保存为 cleanup_navicat_backups.ps1):
Get-ChildItem -Path "D:\navicat_backups" -Filter "*.sql" -File |
Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} |
Remove-Item -Force
关键点:
-
-Path必须填你实际备份目录(查Backup to设置,常见如C:\Users\XXX\Documents\Navicat\MySQL\servers\...) -
-Filter按你导出格式改:SQL 备份用"*.sql",Navicat 自有格式用"*.nb3" -
AddDays(-7)表示删除「最后修改时间早于当前时间 7 天」的文件,不是按文件名里的日期解析 - 务必先去掉
Remove-Item,用ForEach-Object { Write-Host $_.FullName }预览匹配结果
Linux/macOS 用 find 一行命令搞定
POSIX 系统直接用 find 最轻量,无需额外依赖:
find ~/Documents/Navicat/Backups -name "*.nb3" -mtime +7 -delete
注意:
-
-mtime +7表示“修改时间超过 7 天”,等价于 PowerShell 的AddDays(-7) - Navicat for Linux 默认备份路径通常是
~/Documents/Navicat/Backups/,但你可能自定义过,得确认 - 首次运行前加
-print替代-delete,看哪些文件会被删 - 如果备份路径含空格或符号,用
find "...path..." -name "*.nb3" -type f -mtime +7 -exec rm {} \;更安全
定时任务必须单独配,且路径不能含中文或空格(尤其 Windows)
Windows 任务计划程序调用脚本时,如果路径含中文,forfiles 会直接报错 'xxx' 不是内部或外部命令;find 在 Linux 上遇到编码问题也可能失败。
避坑要点:
- PowerShell 脚本路径建议全英文、无空格(如
D:\navicat_clean\cleanup.ps1) - 任务计划中“起始于”字段要填脚本所在目录,否则
Get-ChildItem相对路径会失效 - Linux 下用
crontab -e添加:0 2 * * * find /home/user/navicat_bak -name "*.sql" -mtime +7 -delete(每天凌晨 2 点执行) - 无论哪套方案,首次部署后手动运行一次脚本,再检查目标目录是否真删了旧文件——别只信日志
真正容易被忽略的是:Navicat 从不校验备份文件是否可还原。删之前,至少抽样验证一两个近期备份能否成功恢复。否则清理脚本跑得再准,也救不回损坏或截断的备份。











