You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SQL数据库备份Bat文件执行时覆盖旧备份文件?

解决SQL备份脚本无法覆盖旧文件的问题

你的脚本无法覆盖旧备份,是因为SQL Server的BACKUP DATABASE命令默认是追加内容到现有备份文件,而不是替换它。要实现覆盖或避免冲突,有以下几种可行方案:

方案1:使用WITH INIT参数强制覆盖备份文件

直接在备份命令中添加WITH INIT,让SQL Server替换掉现有备份文件的内容,而不是追加:

修改脚本中对应的备份代码段:

FOR /F "tokens=*" %%I IN (%DBList%) DO (
ECHO Backing up database: %%I
SqlCmd -E -S ERP2 -Q "BACKUP DATABASE [%%I] TO Disk='D:\SQL ERP2_Backup\%%I.bak' WITH INIT"
ECHO.)

注意:这个参数会完全覆盖原有备份文件,若需要保留历史备份,不建议使用此方案。

方案2:生成带日期的备份文件名(推荐)

你已经定义了NowDate变量但未启用,利用它给备份文件加上日期后缀,既不会覆盖旧备份,还能保留历史版本:

修改备份代码段:

FOR /F "tokens=*" %%I IN (%DBList%) DO (
ECHO Backing up database: %%I
SqlCmd -E -S ERP2 -Q "BACKUP DATABASE [%%I] TO Disk='D:\SQL ERP2_Backup\%%I_%NowDate%.bak'"
ECHO.)

生成的文件名会是类似YourDB_2024-05-20.bak的格式,每次运行都生成新文件,无冲突且能清晰区分备份时间。

方案3:备份前删除旧备份文件

在执行备份命令前,先删除对应数据库的旧bak文件,再执行备份:

修改备份代码段:

FOR /F "tokens=*" %%I IN (%DBList%) DO (
ECHO Deleting old backup for: %%I
DEL /F /Q "D:\SQL ERP2_Backup\%%I.bak"
ECHO Backing up database: %%I
SqlCmd -E -S ERP2 -Q "BACKUP DATABASE [%%I] TO Disk='D:\SQL ERP2_Backup\%%I.bak'"
ECHO.)

注意:此方法会直接删除旧文件,丢失历史备份,适合仅需保留最新备份的场景。

内容的提问来源于stack exchange,提问作者Ray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:37:27