Managing SQL Server backups used to be a headache for me—especially when dealing with a network share. I needed a way to automate daily backups while ensuring old backups didn’t pile up and eat up storage space. Manually deleting old files was not an option, so I set out to create a fully automated solution using SQL Server Agent and PowerShell.
In this blog post, I’ll share how I successfully set up daily SQL Server backups to a network share and automatically deleted backups older than 7 days. Whether you’re a database administrator or a developer looking to streamline your backup process, this guide will help you do it efficiently. Let’s dive in!
Running the T-SQL Script below will automatically backup your databases and delete backups older than 7 days;
Just make sure to change the Network Shared folder directory, username and password, and the path according to your network settings.
DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name DECLARE @Cmd NVARCHAR(500) -- Enable xp_cmdshell (if not already enabled) EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; -- Mapped the shared folder EXEC xp_cmdshell 'net use s: \\123.123.123.2\SharedFolder /user:whatever\username password' -- specify database backup directory SET @path = 'S:\Backup\' -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) -- Backup databases except system databases DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases AND state = 0 -- database is online AND is_in_standby = 0 -- database is not read only for log shipping OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor -- Delete backups older than 7 days SET @Cmd = 'powershell.exe -Command "Get-ChildItem -Path ''' + @path + '*.bak''' + ' | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | Remove-Item -Force"' EXEC xp_cmdshell @Cmd
If you want to run this daily, just create a new SQL Server agent Job.