2017-04-12 71 views
0

我遇到了SQL维护计划清理任务的问题,不是每天晚上删除一个特别大的数据库备份,它工作几天然后失败,然后再次开始工作,它始终在小型数据库上正常工作。T-SQL数据库备份清理删除前要删除的文件的脚本日志记录

我研究了这个维护计划清理任务问题,并尝试了所有我能想到的工作,将扩展匹配更改为*,在文件夹路径末尾添加了\,更改了年龄没有NONE,因此所有文件都将被删除无论年龄大小,仍然有时候这个备份不会被删除。

所以我实现了这个SQL作业使用下面的脚本来看看是否能够正常工作,但同样的问题再次,间歇性的大的备份文件不会被删除,当我手动运行任务,它似乎永远删除。

我的问题是,有没有办法首先获得符合删除条件的文件列表,并在实际尝试删除文件之前将它们写入日志文件,这样我至少可以看到是否有一些原因是大型备份文件与首先要删除的条件不匹配。

任何帮助,否则使用T-SQL删除旧的备份文件,而不使用xp_cmdshell和不使用批处理或PowerShell脚本将不胜感激。

declare @dt datetime 
select @dt=dateadd(hh,-22,getdate()) 
EXECUTE master.dbo.xp_delete_file 0,N'Z:\SQLBackups\',N'BAK',@dt,1 

我在遇到问题的SQL Server版本:

微软SQL Server Management Studio中10.50.4042.0

微软的Analysis Services客户端工具10.50.4042.0

Microsoft数据Access Components(MDAC)6.1.7601.17514

Microsoft MSXML 3.0 6.0

Microsoft Internet Explorer中9.10.9200.17609

的Microsoft .NET Framework 2.0.50727.5485

操作系统6.1.7601

回答

0

创建PowerShell脚本删除文件并找到错误“后的另一种方法是使用文件“我使用此脚本来检查使用handle64.exe程序的哪个进程,并发现它是锁定该文件的Commvault代理CLBackup.exe。

备份计划冲突是问题的原因。

$log = ($MyInvocation.MyCommand.Path).TrimEnd("ps1") + "log" 
$handlelog = ($MyInvocation.MyCommand.Path).TrimEnd(".ps1") + "-Handle.log" 
$1 = gci 'Z:\SQLBackups' | %{gci $_.fullname -Filter '*.BAK' | ? {$_.LastWriteTime -le (get-date).addhours(-22)}} 
write-output "$(get-date -format g) Files will be deleted: $1" >> $log 
$1 | % {remove-item $_.fullname -force -Confirm:$FALSE} 
if (!!($error)) { 
write-output "$(get-date -format g) Open Handles on .BAK files:" >> $handlelog 
$exec = "$env:SystemRoot\system32\cmd.exe /c" + (Split-Path($MyInvocation.MyCommand.Path)) + "\handle64.exe .BAK -u -nobanner -accepteula" 
Invoke-Expression -Command:$exec >> $handlelog 
$error >> $log 
}