xp_delete_file用来删除数据库的备份文件和维护计划文本报告。示例:
EXECUTE master.dbo.xp_delete_file 0,N'D:\Backup\Diff',N'bak',N'2019-05-29T10:03:41'
第一个参数表示文件类型,0表示备份文件,1表示文本报告
第二个参数表示要删除的文件存放路径
第三个参数表示要删除的文件后缀,不能带点号。比如写成bak,不能写成.bak
第四个参数是一个日期,文件修改日期(不是创建日期)比这个参数旧的,就删除。(日期相等不删除)
第五个参数为0或1。0表示不查找子目录的文件,1表示在当前路径和下一层路径中查找要删除的文件(最多只遍历一层)。默认值是0,可以省略。
xp_delete_files会校验备份文件和报告文本文件的头,只有合法的备份文件和报告文本才会被删除,其他文件改个后缀,是不会被删除的。
今天碰到的现象是执行这个脚本后,旧备份文件并没有被删除。最后,在https://*.com/questions/212603/sql-server-xp-delete-file-not-deleting-files/35384431#35384431找到原因,数据库需要有登录名“NT SERVICE\MSSQLSERVER”
并且需要sysadmin角色。
另外,添加完这个用户还顺便解决了SQL SERVER日志打不开的情况。
之前打开SQL SERVER日志,弹出如下报错:
事件查看器有如下两条相关报错日志:
用户 'TICPD\servername$' 登录失败。 原因: 找不到与提供的名称匹配的登录名。 [客户端: <local machine>]
严重性: 16 错误: 18456,操作系统: 18456 [Microsoft][SQL Server Native Client 11.0][SQL Server]用户 'TICPD\servername$' 登录失败。 消息资源存在,但在字符串/消息表中找不到该消息
执行exec master.dbo.sp_enumerrorlogs报错:
消息 22004,级别 16,状态 1,第 105 行
无法打开环回连接。有关详细信息,请参阅事件日志。
消息 22004,级别 16,状态 1,第 105 行
找不到错误日志位置。
添加完NT SERVICE\MSSQLSERVER登录名,上面报错也都解决了。