背景:
我们有一个需要 xp_cmdshell 才能运行的备份脚本。我决定在新服务器上不启用 xp_cmdshell。我在作业开始时启用了 xp_cmdshell,并在作业结束时将其关闭。问题是,如果完整备份开始并且每小时日志备份运行并完成,它将关闭 xp_cmdshell,并且每小时备份将失败。
这让我开始尝试检测某项作业是否正在运行等等。但是,有没有更好的清理方法呢?
实际问题:
备份作业成功运行后,如何删除旧备份文件?
它需要可编写脚本,如果我理解正确的话,这可以排除维护计划。
它不会使用 xp_cmdshell 来避免整个作业交互并遵循良好的做法。
最好的方案是让它在备份脚本中执行,这样在成功备份后它会删除备份文件。如果备份因任何原因出现错误,这可以让其他数据库的备份继续进行。
推测: 也许 powershell 脚本可以解决问题?可以将其编写到作业步骤中,并在成功时有条件地执行...但是,如果我们中途失败,那么这一切都会在最后发生,留下备份 - 如果空间紧张,则需要手动清理备份驱动器。
也许我只需在要关闭小时作业中的 xp_cmdshell 时检查小时作业是否正在运行。我可能会这样做,但你会怎么做?
答案1
我在备份步骤之后向备份作业添加了一个作业步骤,并运行了以下代码版本。这将删除所有超过 1 天的 BAK 文件。
declare
@Ext NVARCHAR(4)
,@DelDt VARCHAR(19)
,@BackupPath VARCHAR(800)
select
@Ext = 'bak'
,@BackupPath = 'D:\SQLBAK'
SELECT
@DelDt = CONVERT(VARCHAR(19), DATEADD(hh, -24, GETDATE()), 126)
EXEC master.dbo.xp_delete_file 0, @BackupPath, @Ext, @DelDt