Una de las labores como DBA es verificar diariamente y garantizar que los backups se realicen de manera satisfactoria y acorde a lo planeado; de igual menara se debe establecer dentro del plan de backups un tiempo de retención para los mismos ya que si no realizamos un adecuado mantenimiento del almacenamiento de estos backups podremos encontrarnos con problemas de espacio disponible.Teniendo en cuenta lo anterior quiero compartir con ustedes un script que nos permite eliminar los backups que tengan como mínimo n días de antigüedad y que se encuentren en un directorio especifico de nuestro servidor de bases de datos incluyendo todos sus subdirectorios.
DECLARE@archivo VARCHAR(100),
@sentencia VARCHAR(100),
@ruta VARCHAR(100),
@dias VARCHAR (100),
@comando VARCHAR(255)
SET @dias = 4 --Especificar el numero de dias de antigüedad
BEGIN TRY
CREATE TABLE #dir(dir VARCHAR(255))
CREATE TABLE #borrar(nombre_archivo VARCHAR(255),fecha_archivo DATETIME)
--Cambiar la ruta del directorio donde se encuentran los backups, no olvidar el \ al final de la ruta.
SET @ruta= 'D:\backup\' SET @comando = 'dir /s ' + @ruta
INSERT INTO #dir EXEC MASTER..xp_cmdshell@comando
INSERT INTO #borrar(fecha_archivo,nombre_archivo) SELECT convert(DATETIME,(SELECT SUBSTRING(dir,1,10)),103), LTRIM(RTRIM(SUBSTRING(dir, LEN(dir)-CHARINDEX(' ',reverse(dir)) + 1,255)))
FROM #dir
WHERE (dir like '%/%%/%') and(dir not like '%<DIR>%') AND
(dir LIKE '%.trn' OR dir like '%.bak')
AND DATEDIFF(DAY, CONVERT(DATETIME,SUBSTRING(dir,1,10),103), GETDATE()) >= @dias
DECLARE C_Borrar CURSOR FOR SELECT nombre_archivo
FROM #borrar
OPEN C_Borrar
FETCH NEXT FROM C_Borrar INTO @archivo
WHILE @@FETCH_STATUS= 0 BEGIN
SET @sentencia = ' DEL ' + @ruta + @archivo + ' /s'
EXEC master..xp_cmdshell@sentencia
FETCH NEXT FROM C_Borrar INTO @archivo
END
CLOSE C_Borrar DEALLOCATE C_Borrar
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
GOTO END_SCRIPT
END CATCH
END_SCRIPT:BEGIN TRY
DROP TABLE #dir
DROP TABLE #borrar
END TRY
BEGIN CATCH
PRINT 'No existen las tablas para borrar'
END CATCH
Clic aquí para descargar el script.
Es importante tener en cuenta que se debe establecer el número de días mínimo de antigüedad que tendrán los backups que deseamos eliminar, para esto asignamos el valor a la variable @dias; de igual manera es MUY IMPORTANTE tener en cuenta que si existen dos o mas archivos con el mismo nombre (en algun subdirectorio) y uno de ellos cumple la condicion de antigüedad, todos ellos seran eliminados.