清理没有 xp_cmdshell 或维护计划的备份文件

清理没有 xp_cmdshell 或维护计划的备份文件

背景:

我们有一个需要 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

相关内容