当前位置: 代码网 > it编程>数据库>MsSqlserver > sql server删除过期备份文件的脚本

sql server删除过期备份文件的脚本

2024年10月15日 MsSqlserver 我要评论
一、通过脚本查看过期文件,时间可以自己设定for /f "delims=" %i in ('dir /b /a-d "e:\mybak_file\*.bak" ^| findstr /i "backu

一、通过脚本查看过期文件,时间可以自己设定

for /f "delims=" %i in ('dir /b /a-d "e:\mybak_file\*.bak" ^| findstr /i "backup" ^| findstr /v /i "no_backup"') do @if "%~ti" lss "2024/09/29 16:50" echo %~ti name:%i

循环遍历查看小于指定时间点的文件 %i 是文件,也可以输出,切记 %~ti 的格式是 年/月/日 时:分
如果要对比的话要吧%~ti用双引号引起来,后面的时间字符串也引用起来!

二、删除过期文件

declare @path nvarchar(255) = 'e:\mybak_file\';  -- 备份文件存储路径
declare @cutoffdate nvarchar(120) = replace(convert(varchar(16), dateadd(day, -14, getdate()), 120), '-', '/');
declare @cmd nvarchar(4000);

-- 删除超过两周的备份文件
set @cmd = 'for /f "delims=" %i in (''dir /b /a-d "' + @path + '*.bak" | findstr /i "backup" | findstr /v /i "no_backup" '') do @if "%~ti" lss "' + convert(varchar, @cutoffdate, 120) + '" del "' + @path + '%i"';

-- 临时启用 xp_cmdshell
exec sp_configure 'show advanced options', 1;  
reconfigure;  
exec sp_configure 'xp_cmdshell', 1;  
reconfigure;

-- 执行您的命令
exec xp_cmdshell @cmd;

-- 恢复 xp_cmdshell 的状态(可选)
exec sp_configure 'xp_cmdshell', 0;  
reconfigure;

这里执行之后还是没有成功删除,继续修改脚本!!!!!!

三、问题解决

命令里面的管道符,必须要转义,否则会报错,报错内容如下

此时不应有 |。

管道符号(|)的误用: sql server 的 t-sql 语言本身并不支持管道符号(|)。如果您尝试在 sql 查询中直接使用它,可能会导致该错误。管道符号通常用于命令行界面或其他编程环境(例如 powershell)。

错误的命令: 如果您在 sql server 中执行的命令尝试以不正确的格式使用 sql server 的功能或选项,可能也会引发此错误。

真是一波三折啊,命令拼好如下:

for /f "delims=" %i in ('dir /b /a-d "e:\yunbak_file\*.bak" ^| findstr /i "backup" ^| findstr /v /i "no_backup" ') do @if "%~ti" lss "2024/09/16 17:31" echo del "e:\yunbak_file\%i"

直接在cmd执行一点问题没有,但是用xp_cmdshell 执行,就是不行,还会误删所有文件,一直百思不得其解,后来多种测试以后发现是%~ti压根没有获取到。

终于找到方法解决了,真是太不容易了,不过还是对命令不熟悉,这里尝试多次后发现以下命令可以完美解决!!

for /f "tokens=1,2,4 delims= " %i in ('dir /t:w "e:\yunbak_file\*.bak" ^| findstr /i "backup" ^| findstr /v /i "no_backup" ') do @if "%i %j" lss "2024/09/16 17:54" echo del "e:\yunbak_file\%k"

四、终极版本

以下是修改后的完整的清理备份文件的脚本(终极版本):

declare @path nvarchar(255) = 'e:\yunbak_file\';  -- 备份文件存储路径
declare @cutoffdate nvarchar(120) = replace(convert(varchar(16), dateadd(day, -14, getdate()), 120), '-', '/');
declare @cmd nvarchar(4000);

-- 删除超过两周的备份文件

set @cmd = 'for /f "tokens=1,2,4 delims= " %i in (''dir /t:w "' + @path + '*.bak" ^| findstr /i "backup" ^| findstr /v /i "no_backup" '') do @if "%i %j" lss "' + convert(varchar, @cutoffdate, 120) + '" del "' + @path + '%k"';

select @cmd;
-- 临时启用 xp_cmdshell
exec sp_configure 'show advanced options', 1;  
reconfigure;  
exec sp_configure 'xp_cmdshell', 1;  
reconfigure;


-- 执行您的命令
exec xp_cmdshell @cmd;

-- 恢复 xp_cmdshell 的状态(可选)
exec sp_configure 'xp_cmdshell', 0;  
reconfigure;

到此这篇关于sql server删除过期备份文件的脚本的文章就介绍到这了,更多相关sql server删除过期文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com