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
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
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
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
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
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.