By: Eli Leiba | Updated: 2016-10-13 | Comments (6) | Related: > Backup
Problem
You want to remove old SQL Server backup files (older than X days) from the backup folder to free drive space. You want to do this using T-SQL and not by using a Maintenance Plan or a Windows Scheduled Task. The advantage of using T-SQL is that you can keep the administrative tasks inside the database server and keep as part of a database back up when you backup the database. How can this be accomplished using T-SQL?
Solution
I chose a solution that creates a stored procedure called usp_DeleteOldBackupFiles. The procedure gets the backup files folder location (@BackupFolderLocation), the files suffix (@FilesSuffix either BAK or TRN which are the standard for database and log backup files) and the number of days old (@DaysToDelete) to delete the files (this is based on the files modified date).
For example: if a BAK file has a modified date of 03/09/2016 (mm/dd/yyyy format) and the current date is 03/14/2016 then if the @DaysToDelete = 6 the file will not be deleted. If @DaysToDelete = 4 the file will be deleted.
Since the procedure calls the DOS command (forfiles.exe), xp_cmdshell needs to be enabled.
Enable SQL Server xp_cmdshell
use master go exec sp_configure 'show advanced options',1 go reconfigure with override go exec sp_configure 'xp_cmdshell',1 go reconfigure with override go
You should get the following messages in SSMS after running the above.
Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install. Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
Windows FORFILES command to delete SQL Server Backups
This FORFILES statement executes a command on a file or set of files.
The general syntax of the statement is:
forfiles [/p <path>] [/m <searchmask>] [/s] [/c "<command>"] [/d [{+|-}][{<date>|<days>}]]
We will use the suffix parameter as the search mask /m switch, the folder parameter as the path /p switch and the days parameter as the given value to the /d switch.
Stored Procedure to Delete Old SQL Server Database Backups
CREATE PROCEDURE usp_DeleteOldBackupFiles ( @BackupFolderLocation VARCHAR(30) ,@FilesSuffix VARCHAR(3) ,@DaysToDelete SMALLINT ) AS BEGIN DECLARE @delCommand VARCHAR(400) IF UPPER (@FilesSuffix) IN ('BAK','TRN') BEGIN SET @delCommand = CONCAT('FORFILES /p ' , @BackupFolderLocation, ' /s /m ' , '*.' , @FilesSuffix , ' /d ' , '-' , ltrim(Str(@DaysToDelete)), ' /c ' , '"' , 'CMD /C del /Q /F @FILE', '"') PRINT @delCommand EXEC sys.xp_cmdshell @delCommand END END GO
Example using procedure to delete SQL Server backup files
We want to remove all the .BAK files from folder C:\SQL\Backup and all its sub-folders. We want to remove all .BAK files older than 10 days. The modified date attribute has to be 10 days older than the current date.
use northwind go EXEC usp_DeleteOldBackupFiles @BackupFolderLocation='c:\SQL\Backup', @FilesSuffix='bak', @DaysToDelete=10
The result will be all files with a suffix BAK older 10 days from current date are deleted. The stored procedure also prints the command in the messages tab in SSMS and would look like this:
FORFILES /p c:\SQL\Backup /s /m *.bak /d -10 /c "CMD /C del /Q /F @FILE"
Things to note:
- The procedure was tested with SQL Server 2012 and SQL Server 2014 Developer editions.
- The xp_cmdshell option needs to be enabled. If the option is not enabled you will get the following error message: Msg 229, Level 14, State 5, Procedure xp_cmdshell, Line 1 The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.
- If the backup folder directory does not exist then nothing occurs (nothing deleted)
- If no BAK or TRN files older than X days exist then nothing occurs (nothing deleted)
- Suffix allowed values are BAK and TRN. This protects from accidental deletion of other types of files.
- A good practice will be to deny execution on this procedure to all database users except the DBA (for security reasons).
Next Steps
- Check out these other backup tips
- Review the SQL Server Backup Tutorial
About the author
This author pledges the content of this article is based on professional experience and not AI generated.
View all my tips
Article Last Updated: 2016-10-13