Eliminar Backups en disco

Publicado el 14 febrero 2013 por Fercasas
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.