DBCC SHRINKDATABASE (Transact-SQL)

Reduce el tamaño de los archivos de datos y de registro de la base de datos especificada.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

DBCC SHRINKDATABASE 
( database_name | database_id | 0 
     [ , target_percent ] 
     [ , { NOTRUNCATE | TRUNCATEONLY } ] 
)
[ WITH NO_INFOMSGS ]

Argumentos

  • database_name | database_id | 0
    Es el nombre o id. de la base de datos que se va a reducir. Si se especifica 0, se utiliza la base de datos actual.

  • target_percent
    Es el porcentaje de espacio disponible que se desea dejar en el archivo de la base de datos después de reducir la base de datos.

  • 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. target_percent es opcional.

    El espacio disponible del final del archivo no se devuelve al sistema operativo y el tamaño físico del archivo no cambia. Por tanto, si se especifica NOTRUNCATE, parecerá que la base de datos no se reduce.

    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. target_percent se omite si se especifica con TRUNCATEONLY.

    TRUNCATEONLY afecta al archivo de registro. Para truncar solo el archivo de datos, use DBCC SHRINKFILE.

  • WITH NO_INFOMSGS
    Suprime todos los mensajes informativos con niveles de gravedad entre 0 y 10.

Conjuntos de resultados

En la tabla siguiente se describen las columnas del conjunto de resultados.

Nombre de columna

Descripción

DbId

Número de identificación de la base de datos del archivo que el Motor de base de datos intentó reducir.

FileId

Número de identificación del archivo que el Motor de base de datos intentó reducir.

CurrentSize

El número de páginas de 8 KB que el archivo ocupa actualmente.

MinimumSize

El número de páginas de 8 KB 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 de 8 KB que utiliza actualmente el archivo.

EstimatedPages

El número de páginas de 8 KB al que el Motor de base de datos estima que se puede reducir el archivo.

[!NOTA]

El Motor de base de datos no presenta filas para los archivos que no se reducen.

Comentarios

Para reducir todos los archivos de datos y de registro de una base de datos específica, ejecute el comando DBCC SHRINKDATABASE. Para reducir un archivo de datos o de registro cada vez para una base de datos específica, ejecute el comando DBCC SHRINKFILE.

Para ver la cantidad actual de espacio disponible (sin asignar) en la base de datos, ejecute sp_spaceused.

Las operaciones SHRINKDATABASE pueden detenerse en cualquier momento del proceso y se conserva el trabajo completado hasta ese momento.

El tamaño de la base de datos no puede ser menor que el tamaño mínimo de la base de datos. El tamaño mínimo es el tamaño especificado cuando se creó la base de datos o el último tamaño establecido explícitamente mediante una operación de cambio de tamaño de archivo, como DBCC SHRINKFILE o ALTER DATABASE. Por ejemplo, si se creó una base de datos con un tamaño de 10 MB y ha crecido hasta llegar a 100 MB, solo podrá reducirla hasta un tamaño de 10 MB, aunque todos los datos de la base de datos se hayan eliminado.

Ejecutar DBCC SHRINKDATABASE sin especificar la opción NOTRUNCATE o la opción TRUNCATEONLY equivale a ejecutar una operación DBCC SHRINKDATABASE con la opción NOTRUNCATE seguida de una operación DBCC SHRINKDATABASE con TRUNCATEONLY.

La base de datos que se comprime no tiene que estar en modo de usuario único; otros usuarios pueden estar trabajando en la base de datos cuando ésta se está reduciendo. Esto incluye las bases de datos del sistema.

No se puede reducir una base de datos mientras se está realizando una copia de seguridad de la misma. Asimismo, no se puede realizar una copia de seguridad de una base de datos mientras se está realizando una operación de reducción de ésta.

DBCC SHRINKDATABASE producirá un error cuando encuentra un índice de almacén de columnas optimizado de memoria xVelocity. El trabajo realizado antes de encontrar el índice de almacén de columnas se llevará a cabo correctamente, por lo que es posible que la base de datos sea más pequeña. Para completar DBCC SHRINKDATABASE, deshabilite todos los índices de almacén de columnas antes de ejecutar DBCC SHRINKDATABASE y después regenere los índices de almacén de columnas.

Cómo funciona DBCC SHRINKDATABASE

DBCC SHRINKDATABASE reduce los archivos de datos de uno en uno, pero reduce los archivos de registro como si todos estuvieran en una agrupación de registros contiguos. Los archivos se reducen siempre desde el final.

Suponga que una base de datos llamada mydb tiene un archivo de datos y dos archivos de registro. Los archivos de datos y de registro tienen 10 MB cada uno, y el archivo de datos contiene 6 MB de datos.

Para cada archivo, el Motor de base de datos calcula un tamaño de destino. Este es el tamaño al que se debe reducir el archivo. Cuando DBCC SHRINKDATABASE se especifica con target_percent, el Motor de base de datos calcula el tamaño final para que quede target_percent de espacio disponible en el archivo tras la reducción. Por ejemplo, si establece el valor de target_percent en 25 para reducir mydb, Motor de base de datos calcula que el tamaño final de este archivo será de 8 MB (6 MB de datos más 2 MB de espacio disponible). Por tanto, el Motor de base de datos pasa los datos de los últimos 2 MB del archivo de datos al espacio disponible de los primeros 8 MB del archivo de datos y, a continuación, reduce el archivo.

Suponga que el primer archivo de datos de mydb contiene 7 MB de datos. Si se especifica un target_percent de 30, este archivo de datos se puede reducir al porcentaje libre de 30. Sin embargo, si se especifica un target_percent de 40, no se reduce el archivo de datos porque Motor de base de datos no reducirá ningún archivo a un tamaño menor que el que los datos ocupan actualmente. O lo que es lo mismo: 40 por ciento de espacio disponible + 70 por ciento de datos en el archivo (7 MB de 10 MB) es mayor que 100 por ciento. Como el porcentaje de espacio disponible deseado más el porcentaje actual ocupado por los datos supera el 100 por ciento (en un 10 por ciento), con un target_size superior a 30 no se reducirá el archivo de datos.

En los archivos de registro, el Motor de base de datos utiliza el parámetro target_percent para calcular el tamaño final de todo el registro, de forma que target_percent sea la cantidad de espacio disponible del registro después de la operación de reducción. El tamaño final del registro entero se traduce al tamaño final de cada archivo de registro.

DBCC SHRINKDATABASE 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 DBCC SHRINKDATABASE finaliza sin mensajes. Sin embargo, si parte del registro lógico está en los registros virtuales más allá del tamaño final, el Motor de base de datos libera tanto espacio como sea posible y a continuación emite un mensaje informativo. El mensaje indica las acciones que se deben llevar a cabo para mover el registro lógico de los registros virtuales al final del archivo. Después de que se realizan estas acciones, se puede utilizar DBCC SHRINKDATABASE para liberar el espacio restante.

Como un archivo de registro solo puede reducirse al límite de un archivo de registro virtual, puede que no sea posible reducirlo a un tamaño menor que el de un archivo de registro virtual, aunque no esté siendo utilizado. Motor de base de datos elige dinámicamente el tamaño del archivo de registro virtual cuando se crean o se extienden archivos de registro.

Procedimientos recomendados

Tenga en cuenta la siguiente información cuando vaya a reducir una base de datos:

  • La reducción es más efectiva después de una operación que cree mucho espacio inutilizado, como por ejemplo 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 reiterada 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.

Solucionar problemas

Es posible bloquear las operaciones de reducción mediante una transacción que se ejecuta con un nivel de aislamiento basado en versiones de fila. Por ejemplo, si se está ejecutando una operación de eliminación grande con un nivel de aislamiento basado en versiones de fila cuando se ejecuta una operación DBCC SHRINK DATABASE, la operación de reducción esperará a que la operación de eliminación se haya completado antes de reducir los archivos. Cuando esto sucede, las operaciones DBCC SHRINKFILE y DBCC SHRINKDATABASE imprimen un mensaje informativo (5202 en el caso de SHRINKDATABASE y 5203 para SHRINKFILE) en el registro de errores de SQL Server cada cinco minutos durante la primera hora, y cada hora sucesivamente.  Por ejemplo, si el registro de errores contiene el siguiente mensaje de error:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot 
transaction with timestamp 15 and other snapshot transactions linked to 
timestamp 15 or with timestamps older than 109 to finish.

Esto significa que la operación de reducción está bloqueada por transacciones de instantánea que tienen marcas de tiempo anteriores a 109, que es la última transacción que ha completado la operación de reducción. También indica que las columnas transaction_sequence_num o first_snapshot_sequence_num de la vista de administración dinámica sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) contienen el valor 15. Si la columna transaction_sequence_num o first_snapshot_sequence_num contiene un número inferior al de la última transacción completada mediante una operación de reducción (109), la operación de reducción esperará a que las transacciones finalicen.

Para resolver el problema, puede llevar a cabo una de las tareas siguientes:

  • Finalizar la transacción que está bloqueando la operación de reducción.

  • Finalizar la operación de reducción. Se conservará todo el trabajo completado.

  • No hacer nada y permitir que la operación de reducción espere a que finalice la transacción que la está bloqueando.

Permisos

Debe pertenecer al rol fijo de servidor sysadmin o al rol fijo de base de datos db_owner.

Ejemplos

A.Reducir una base de datos y especificar un porcentaje de espacio disponible

En este ejemplo se reduce el tamaño de los archivos de datos y de registro de la base de datos de usuario UserDB para dejar un 10 por ciento de espacio disponible en la base de datos.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B.Truncar una base de datos

En el ejemplo siguiente se reducen los archivos de datos y de registro en la base de datos de ejemplo AdventureWorks al último tamaño asignado.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);

Vea también

Referencia

ALTER DATABASE (Transact-SQL)

DBCC (Transact-SQL)

DBCC SHRINKFILE (Transact-SQL)

Conceptos

Reducir una base de datos