Shrink de base de datos en SQL Server

Hola a todos, hoy os vamos a hablar de una de las tareas más recurrentes de un DBA. En este caso vamos a hablar de un shrink de base de datos en SQL Server.

¿Qué es un shrink?

Antes de ponernos a trabajar, necesitamos saber qué es un shrink y saber si es recomendable en tu caso. Este proceso lo que haces es reorganizar las páginas a nivel de disco para liberar espacio liberado previamente a nivel de base de datos.

shrink de base de datos en SQL Server

Este tipo de proceso se puede realizar con los ficheros de datos y los ficheros de log. Pongamos unos ejemplos. Una base de datos está creciendo demasiado, por una tabla de log que ha introducido la aplicación, porque va acumulando datos de años anteriores que están ralentizando las consultas y llenando el disco…y se decide hacer un borrado.

Después de borrar datos de años anteriores y liberar varios GB la tabla tiene menos registros pero sin embargo, el disco sigue estando al límite. ¿Por qué? Porque el borrado de registros libera espacio a nivel de bases de datos, pero no a nivel de disco. Es en esta última parte donde entra en juego el shrink.

Suponiendo que la base de datos que se ha hecho el borrado tiene 100 GB, y tras el borrado se han liberado 40 GB, el shrink lo que hará será reorganizar las páginas a nivel de disco para liberar espacio y tener esos 40 GB libres en disco. Hasta entonces, aunque siga habiendo 40 GB libres, en disco, seguirá ocupando 100 GB.

¿Cuándo es recomendable?

Esta es la pregunta del millón. Aunque pueda parecer maravilloso, realizar un shrink todos los fines de semana por ejemplo, para ir teniendo siempre el espacio óptimo, no es nada recomendable. El shrink solo debe hacerse en momentos puntuales. Momentos en los que el disco está al límite, no es posible ampliar, y es necesario liberar espacio en disco para no tener una parada del servicio.

Siempre debe plantearse el shrink, como última opción. Si nuestra base de datos está teniendo un gran crecimiento, y no hay ninguna incidencia / cambio en la aplicación que lo esté produciendo, debemos adaptar los discos a tal crecimiento. Ya sea ampliando su espacio, si es posible en entornos virtualizados, o bien, independizando la base de datos en otro disco para que tenga margen suficiente para ella sola. Es muy común ver una base de datos o 3 o 4 grandes, y muchas pequeñas en la misma ubicación que apenas tienen crecimiento ni carga. En este caso, si es posible, lo recomendable, sería separar esa base de datos grande del resto de base de datos, por carga de trabajo en el disco, así como espacio disponible para el resto de bases de datos.

¿Cómo se realiza?

Si después de todo esto no queda otra que realizar un shrink, debemos saber primero, cuanto espacio disponible hay para saber si va a merecer la pena y comprobar después si ha liberado todo. Para ello ejecutaremos la siguiente query que nos devolverá el tamaño disponible en la base de datos, tanto de los ficheros de datos como de log:

USE [MyDB]
go
SELECT name
    , size / 128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT) / 128.0 AS AvailableSpaceInMB
FROM sys.database_files;

Para realizar un shrink de un fichero de datos debemos realizar lo siguiente:

USE [MyDB]
GO
DBCC SHRINKFILE (N'MyDB_Data' , 0)
GO

En este caso, debemos indicar el nombre lógico del fichero de datos, que nos lo dirá la query anterior, así como el tamaño que queremos dejarlo. Por ejemplo se puede poner que reduzca hasta 70000 MB por ejemplo, pero para indicar todo el espacio disponible, sin indicar una cifra exacta, indicamos 0 en el segundo parámetro. De esta forma, reducirá todo el espacio disponible.

¿Cómo hacer un shrink de fichero de log en SQL Server?

Aunque en este último caso nos hemos centrado en liberar espacio del fichero de datos, borrando datos antiguos de una tabla por ejemplo. También se puede realizar shrink del fichero de log. En este caso, hay que tener en cuenta que la base de datos tiene que estar en modo de recuperación SIMPLE. De lo contrario, no liberará espacio. En el caso de estar la BBDD en FULL, la única opción de liberar espacio del fichero de log, sería ejecutando el shrink, justo después del backup de log, para que intente recuperar el espacio disponible. Esto requiere tiempo y ejecución manual muy rápida tras el backup, y no siempre es posible liberar hasta que no se pone en SIMPLE la base de datos, algo que es inviable estando en AlwaysOn por ejemplo.

Esperamos que esta entrada os haya servido. Si tenéis problemas constantes de crecimiento de base de datos y llenado de disco por ese motivo, o necesitáis realizar un shrink, podemos ayudarte y recomendarte la mejor opción en tu caso. Somos expertos en bases de datos SQL Server y podemos ayudarte con el mantenimiento de esta base de datos. Puedes contactar con nosotros sin compromiso.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *