DBCC SHRINKDATABASE (Transact-SQL)

Actualizado: 14 de abril de 2006

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 identificador 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 libre 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 libre 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 libre 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 Database Engine (Motor de base de datos) intentó reducir.

FileId

Número de identificación del archivo que Database Engine (Motor de base de datos) intentó reducir.

CurrentSize

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

MinimumSize

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

Número de páginas de 8 KB que utiliza actualmente el archivo.

EstimatedPages

Número de páginas de 8 KB al que el Database Engine (Motor de base de datos) calcula que se puede reducir el archivo.

[!NOTA]    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 libre (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, 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 un grupo de registros contiguos. Los archivos se reducen siempre desde el final.

Suponga que una base de datos denominada 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, SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) de Microsoft calcula un tamaño final. 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 libre 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 libre). Por tanto, Database Engine (Motor de base de datos) pasa los datos de los últimos 2 MB del archivo de datos al espacio libre 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. Especificar el valor 30 en target_percent permite que este archivo de datos se reduzca hasta un porcentaje libre de 30. Sin embargo, al especificar el valor 40 para target_percent, no se reduce el archivo de datos porque Database Engine (Motor de base de datos) no reducirá un archivo a un tamaño menor del que los datos ocupen actualmente. O lo que es lo mismo: 40 por ciento de espacio libre + 70 por ciento de datos en el archivo (7 MB de 10 MB) es mayor que 100 por ciento. Como el porcentaje de espacio libre deseado más el porcentaje actual ocupado por los datos supera el 100 por ciento (en un 10 por ciento), con un valor de target_size mayor que 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 libre 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, Database Engine (Motor de base de datos) libera tanto espacio como sea posible y a continuación emite un mensaje informativo. El mensaje describe 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 libre 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 una gran operación de eliminación que se ejecuta en un nivel de aislamiento basado en el control de versiones de filas se halla en curso cuando se ejecuta una operación DBCC SHRINK DATABASE, la operación de reducción esperará a que la operación de eliminación finalice 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 hora 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 en la vista de administración dinámica sys.dm_tran_active_snapshot_database_transactions contienen un valor igual a 15. Si alguna de las columnas transaction_sequence_num o first_snapshot_sequence_num de la vista contienen un número inferior al de la última transacción finalizada por 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 libre

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 libre 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);

Vea también

Referencia

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)

Otros recursos

Archivos y grupos de archivos físicos de la base de datos
Cómo reducir una base de datos (SQL Server Management Studio)
Asignación y reutilización de espacio

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

14 de abril de 2006

Contenido nuevo:
  • Se agregó el ejemplo B.
  • Se agregaron tareas de resolución de problemas a la sección "Solucionar problemas".
  • Se agregó información acerca de la opción de base de datos AUTO_SHRINK a la sección "Prácticas recomendadas".
Contenido actualizado:
  • Se aclararon las definiciones de TRUNCATEONLY y NOTRUNCATE.
  • En la sección Notas, se corrigió el tamaño mínimo al que se puede reducir una base de datos.