navicat 不支持自动删除过期备份文件,需借助 powershell(windows)或 find + cron(linux/macos)按修改时间或文件名日期清理;务必先预览再执行删除。
navicat 本身不支持自动删除过期备份文件
这是明确的设计限制,不是你没找到设置项。navicat 的「自动运行」只管触发备份命令(如调用 mysqldump),生成文件后就结束;它不扫描目录、不读取文件名时间戳、也不判断“是否过期”。你在备份任务里找不到 keep last 7 days 或 delete files older than 这类选项——因为根本不存在。
Windows 下用 PowerShell 脚本按修改时间清理最稳妥
PowerShell 原生支持时间运算和中文路径,比批处理更可靠。关键点:
-
-Path必须指向 Navicat 实际写入备份的目录(检查备份任务的Backup to设置) -
-Filter "*.sql"可替换为"*.nb3"或"*.zip",取决于你导出格式 -
AddDays(-7)表示保留最近 7 天,数值按需调整 - 务必先去掉
Remove-Item,只用Write-Host $_.FullName预览匹配结果,确认无误再执行删除
示例脚本(保存为 cleanup_navicat_backups.ps1):
Get-ChildItem -Path "D:\navicat_backups" -Filter "*.nb3" -File | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | ForEach-Object { Write-Host $_.FullName }
Linux/macOS 下用 find + cron 按修改时间清理
find 是标准工具,但要注意:-mtime +7 判定的是“修改时间超过 7 天”,不是创建时间——而 Navicat 导出的文件,修改时间 ≈ 备份完成时间,所以可用。
- 先测试:运行
find /backup/mysql -name "*.sql.gz" -mtime +7 -print确认选中的文件正确 - 再执行:加
-delete参数(注意空格) - 加入 crontab:每天凌晨 2 点运行,例如
0 2 * * * find /backup/mysql -name "*.sql.gz" -mtime +7 -delete - 别用
rm -rf /backup/mysql/*这类通配暴力操作,路径写错可能清空整个备份目录
命名含日期时,优先按文件名解析而非 mtime
如果 Navicat 导出的文件名带标准日期(如 prod_20260720.nb3),建议用正则提取时间判断,比 -mtime 更可靠——因为备份中断重试、系统时间跳变、文件复制等都会污染修改时间。
- PowerShell 示例:用
if ($_ -match '_(\d{8})\.nb3$')提取 8 位日期,再用[datetime]::ParseExact解析 - Linux 示例:用
stat -c '%y %n' *.nb3 | awk '$1 辅助筛选 - 无论哪种方式,清理前都应把待删列表输出到日志或屏幕,人工抽检 2–3 个文件再执行真正删除
真正容易被忽略的不是脚本怎么写,而是权限和验证:清理脚本必须用最小权限专用用户运行,且每次删除前应校验目标文件是否为有效备份(比如开头含 CREATE DATABASE 或 -- MySQL dump),否则可能把半截失败文件当正常备份删掉。











