martes, 31 de octubre de 2017

SQL Server DBCC SHRINKDATABASE

Comando DBCC SHRINKDATABASE

Como se estableció, tratándose de un comando de mantenimiento,  cuando mencionamos los Comandos DBCC,  que este comando lleva a cabo la reducción del tamaño de los archivos de datos y de registro de la base de datos especificada.

Es importante mencionar que este comando debe utilizarse cuando se desea la reducción del tamaño de ambos tipos de archivo, de datos y de registro de transacciones de la base de datos, en caso de que se requiera únicamente llevar a cabo sólo uno de los archivos, entonces se recomienda el uso del comando DBCC SHRINKFILE, que veremos posteriormente.
Se recomienda que para obtener la cantidad de espacio disponible actualmente, esto es, espacio sin asignar en la base de datos, se ejecute el procedimiento sp_spaceused.

Es relevante, en este caso, indicar que los archivos se reducen de uno en uno, sin embargo, reduce los archivos de registro de transacciones como si todos estuvieran en un grupo contiguo de registros.
La sintaxis en su forma mas simple es:

USE master;
GO
DBCC SHRINKDATABASE (database_name);
En el comando se indica que se lleve a cabo la reducción del tamaño de los archivos de la base de datos indicada.  Es necesario indicar que aunque se puede indicar el identificador correspondiente (database_id), éste es un número que está asociado al nombre, pero es mas común el uso del nombre correspondiente. Es importante recordar que los nombres  deben seguir las reglas para los identificadores.

La sintaxis que se usa más a menudo es:

USE master;
GO
DBCC SHRINKDATABASE (database_name, target_percent);
En el comando se indica el nombre de la base de datos, indicando, además, un porcentaje de espacio libre que se desea mantener después de realizada la operación. 

Existen algunos argumentos opcionales que pueden ser utilizados con el comando, estos son:

NOTRUNCATE
Compacta los datos de archivos de datos moviendo páginas asignadas del final de un archivo a páginas no asignadas del principio del archivo. El porcentaje de destino es opcional. NOTRUNCATE solo es aplicable a archivos de datos. No afecta al archivo de registro.
TRUNCATEONLY
Devuelve al sistema operativo todo el espacio disponible del final del archivo, pero no realiza ningún movimiento de página dentro del archivo. El archivo de datos solo se reduce hasta el último tamaño asignado. El porcentaje de destino se omite si se especifica con TRUNCATEONLY. Este argumento afecta al archivo de registro de transacciones únicamente.
WITH NO_INFOMSGS
Suprime todos los mensajes informativos con niveles de gravedad entre 0 y 10.

Se hace necesario indicar, cuando se ejecuta este comando se puede obtener información correspondiente a actividad realizada por la comando, dicha información es:
Columna
Descripción
DbId
Número de identificación de la base de datos del archivo que SQL Server intentó reducir.
FileId
Número de identificación del archivo que SQL Server intentó reducir.
CurrentSize
El número de páginas que el archivo ocupa actualmente.
MinimumSize
El número de páginas que el archivo podría ocupar, como mínimo. Esto corresponde al tamaño mínimo o tamaño de creación original de un archivo.
UsedPages
El número de páginas que utiliza actualmente el archivo.
EstimatedPages
El número de páginas al que SQL Server estima que se puede reducir el archivo

Nota: SQL Server no presentará filas para los archivos que no se reducen

Ejemplos de DBCC SHRINKDATABASE


Mostraré algunos ejemplos de uso de este comando:

USE master;
GO
DBCC SHRINKDATABASE (db1) WITH NO_INFOMSGS;

Este comando lleva a cabo la reducción de archivos en la base de datos db1 indicada, sin emitir mensajes.

USE master;
GO
DBCC SHRINKDATABASE (db1, 10);
Este comando lleva a cabo la reducción de archivos de datos y de registro de transacciones en la base de datos db1 indicada, reservando un 10 por ciento de espacio disponible en la misma base de datos.

USE master;
GO
DBCC SHRINKDATABASE (db1, TRUNCATEONLY);
Este comando lleva a cabo la reducción de archivos de datos y de registro de transacciones en la base de datos db1 indicada, al último tamaño asignado, manteniendo el tamaño del archivo de datos para preservar la información almacenada.

Comentarios


El comando intenta reducir cualquier archivo de registro físico a su tamaño final de forma inmediata. Si ninguna parte del registro lógico se encuentra en los registros virtuales más allá del tamaño final del archivo de registro, el archivo se trunca de manera correcta y finalizará sin mensajes. No obstante, si parte del registro lógico está en los registros virtuales más allá del tamaño final, Microsoft SQL Server libera tanto espacio como sea posible y emitirá un mensaje informativo. El mensaje indicará las acciones que se deben llevar a cabo para mover el registro lógico de los registros virtuales al final del archivo. Una vez que se realicen estas acciones, se puede utilizar el comando para liberar el espacio restante.
Hay que tener en cuenta que cuando vaya a reducir una base de datos; la reducción es más efectiva después de que se ha llevado a cabo operación que crea mucho espacio inutilizado, como puede ser una operación para truncar o eliminar tablas.  

La mayoría de las bases de datos requieren que haya espacio disponible para realizar las operaciones diarias normales. Si se reduce una base de datos en forma continua y su tamaño vuelve a aumentar, esto indica que el espacio que se redujo es necesario para las operaciones normales. En estos casos, no sirve reducir la base de datos reiteradamente.
La reducción no mantiene el estado de fragmentación de los índices de la base de datos y generalmente aumenta la fragmentación hasta cierto punto. Esta es otra razón para no reducir la base de datos reiteradamente. A menos que tenga un requisito específico, no establezca la opción de base de datos AUTO_SHRINK en ON.

Es recomendable ejecutar la instrucción CHECKPOINT en la base de datos antes de utilizar el comando para que las páginas modificadas que se encuentren en la memoria se almacenen adecuadamente en el disco, asimismo, es oportuno indicar que el comando se lleve a cabo cuando la carga de uso de la base de datos haya disminuido y exista la menor cantidad de transacciones abiertas.

1 comentario: