[SQL-LOG] – Reducir el LOG de una Base de Datos.

Saludos amigos después de un tiempo de no postear nada, les dejo un script que reduce el log de una base de datos.

Supongamos que el siguiente archivo LOG pesa demasiado y lo queremos reducir.

image

Como primer paso y previniendo cualquier error que se pueda generar durante la ejecución de la reducción del LOG tendremos que hacer un respaldo de la BD.

 

USE master
GO

BACKUP DATABASE prueba
TO DISK = N'C:\RespaldosBD\Prueba_Full.BAK'
GO

BEGIN TRY

    DECLARE @backupSetId AS INT
    
    SELECT @backupSetId = position
    FROM msdb..backupset
    WHERE database_name=N'Prueba'
       AND backup_set_id=(SELECT MAX(backup_set_id)
                          FROM msdb..backupset
                          WHERE database_name=N'Prueba' )

    IF @backupSetId IS NULL
    BEGIN
       RAISERROR(N'Fallo la verificación. La información de reapaldo para la base de datos, no se encontro.', 16, 1)
    END    
    
    RESTORE VERIFYONLY
    FROM  DISK = N'C:\RespaldosBD\Prueba_Full.BAK'
    WITH  FILE = @backupSetId    

    PRINT 'La verificación se realizo correctamente, el respaldo de la base de datos esta listo para utilizarse.'

END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE()
    PRINT ERROR_LINE()
    PRINT ERROR_NUMBER()
END CATCH
GO

Si todo salió bien tendremos nuestro respaldo en la ubicación indicada en el script anterior.

image

 

Ahora, respaldamos el archivo de LOG y le aplicamos un SHRINKFILE.

El SHRINKFILE Reduce el tamaño del archivo de datos o de registro para la base de datos actual, o vacía un archivo moviendo los datos del archivo especificado a otros archivos del mismo grupo de archivos, permitiendo quitar el archivo de la base de datos. Puede reducir un archivo a un tamaño menor que el tamaño especificado cuando se creó. Así se restablece el tamaño mínimo de archivo al valor nuevo.

@http://msdn.microsoft.com/es-es/library/ms189493.aspx

El CHECKPOINT Escribe en disco todas las páginas desfasadas de la base de datos actual. Las páginas desfasadas son páginas de datos que se han incluido en el caché la memoria y se han modificado, pero todavía no se han guardado en el disco. Los puntos de comprobación permiten ahorrar tiempo en una recuperación posterior al crear un punto en el que se garantiza que todas las páginas desfasadas se hayan escrito en el disco.

El script final:

USE Prueba
CHECKPOINT
BACKUP LOG Prueba TO DISK = 'C:\RespaldosBD\Prueba_Log.trn'
DBCC SHRINKFILE (N'Prueba_Log' , 0, TRUNCATEONLY)
GO

Si todo se ejecuto correctamente tendremos el archivo LOG reducido ‘”Truncado” (para este caso).

Resultado:

image

image 

image

Me hubiera gustado hacer el ejemplo con LOG más grande, pero al momento solo cuento con este, aun así debe funcionar de la misma manera.

Nota: Me paso que al ejecutar el SHRINKFILE a una base de datos desde un acceso remoto, me decía que el archivo LOG no existía aunque físicamente ahí estuviera, después de probar un rato, logre que funcionara, en lugar de utilizar el nombre del archivo LOG, utilice el file_id y listo todo se resolvió.

¿Como saber el File_id?

Si ejecutamos el siguiente query obtendremos los siguientes resultados.

USE Prueba
SELECT * FROM SYS.DATABASE_FILES

image

Ahora que ya sabes el file_id lo usamos en el SHRINKFILE:

USE Prueba
CHECKPOINT
BACKUP LOG Prueba TO DISK = 'C:\RespaldosBD\Prueba_Log.trn'
DBCC SHRINKFILE (2 , 0, TRUNCATEONLY)
GO

Listo, con eso se debe reducir el archivo LOG de una BD.

Espero les sea de ayuda, espero comentarios!!!.