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 temasConvenciones 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 sólo es aplicable a archivos de datos. No afecta a los archivos 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 sólo se reduce hasta el último tamaño asignado. Si se especifica la opción TRUNCATEONLY, no se tiene en cuenta target_percent.

    TRUNCATEONLY sólo es aplicable a archivos de datos. No afecta a los archivos de registro.

  • WITH NO_INFOMSGS
    Suprime todos los mensajes informativos cuyo nivel de gravedad está comprendido 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 Database Engine (Motor de base de datos) intentó reducir.

FileId

Número de identificación del archivo que el Database Engine (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 Database Engine (Motor de base de datos) estima que se puede reducir el archivo.

[!NOTA]

El Database Engine (Motor de base de datos) no presenta filas para los archivos que no se reducen.

Notas

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 SHIRNKFILE 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, sólo 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.

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 Database Engine (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 Database Engine (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, Database Engine (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 Database Engine (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 establece el valor de target_percent en 30, se puede reducir este archivo de datos y mantener un porcentaje de espacio disponible del 30 por ciento. Sin embargo, si se establece el valor de target_percent en 40, no se reducirá el archivo de datos, ya que Database Engine (Motor de base de datos) no reduce un archivo a un tamaño menor que el ocupado por los datos. 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 Database Engine (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 Database Engine (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. Para obtener más información, vea Reducir el registro de transacciones.

Como un archivo de registro sólo 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. Database Engine (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. Para obtener más información acerca de los archivos de registro virtuales, vea Arquitectura física del registro de transacciones.

Prácticas recomendadas

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 el control de versiones de filas. Por ejemplo, si se está ejecutando una operación de eliminación grande con un nivel de aislamiento basado en el control de versiones de filas 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 la columna 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.

Para obtener más información acerca del registro de errores de SQL Server, vea Ver el registro de errores de SQL Server.

Permisos

Debe pertenecer a la función fija de servidor sysadmin o a la función fija 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 en la base de datos de ejemplo AdventureWorks al último tamaño asignado.

DBCC SHRINKDATABASE (AdventureWorks, TRUNCATEONLY);