如何让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
相关产品推荐
相关产品推荐

