DBCC SHRINKDATABASE (Transact-SQL)DBCC SHRINKDATABASE (Transact-SQL)

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Reduce el tamaño de los archivos de datos y de registro de la base de datos especificada.Shrinks the size of the data and log files in the specified database.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

database_name | database_id | 0database_name | database_id | 0
Es el nombre o id. de la base de datos que se va a reducir.Is the name or ID of the database to be shrunk. Si se especifica 0, se utiliza la base de datos actual.If 0 is specified, the current database is used.

target_percenttarget_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.Is the percentage of free space that you want left in the database file after the database has been shrunk.

NOTRUNCATENOTRUNCATE
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.Compacts the data in data files by moving allocated pages from the end of a file to unallocated pages in the front of the file. target_percent es opcional.target_percent is optional. Esta opción no es compatible con Azure SQL Data Warehouse.This option is not supported with Azure SQL Data Warehouse.

El espacio disponible del final del archivo no se devuelve al sistema operativo y el tamaño físico del archivo no cambia.The free space at the end of the file is not returned to the operating system, and the physical size of the file does not change. Por tanto, si se especifica NOTRUNCATE, parecerá que la base de datos no se reduce.Therefore, when NOTRUNCATE is specified, the database appears not to shrink.

NOTRUNCATE solo es aplicable a archivos de datos.NOTRUNCATE is applicable only to data files. No afecta al archivo de registro.The log file is not affected.

TRUNCATEONLYTRUNCATEONLY
Devuelve al sistema operativo todo el espacio disponible del final del archivo, pero no realiza ningún movimiento de página dentro del archivo.Releases all free space at the end of the file to the operating system but does not perform any page movement inside the file. El archivo de datos solo se reduce hasta el último tamaño asignado.The data file is shrunk only to the last allocated extent. target_percent se omite si se especifica con TRUNCATEONLY.target_percent is ignored if specified with TRUNCATEONLY. Esta opción no es compatible con Azure SQL Data Warehouse.This option is not supported with Azure SQL Data Warehouse.

TRUNCATEONLY afecta al archivo de registro.TRUNCATEONLY affects the log file. Para truncar solo el archivo de datos, use DBCC SHRINKFILE.To truncate only the data file, use DBCC SHRINKFILE.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Suprime todos los mensajes informativos con niveles de gravedad entre 0 y 10.Suppresses all informational messages that have severity levels from 0 through 10.

Conjuntos de resultadosResult Sets

En la tabla siguiente se describen las columnas del conjunto de resultados.The following table describes the columns in the result set.

Nombre de columnaColumn name DescripciónDescription
DbIdDbId Número de identificación de la base de datos del archivo que el Motor de base de datosDatabase Engine intentó reducir.Database identification number of the file the Motor de base de datosDatabase Engine tried to shrink.
FileIdFileId Número de identificación del archivo que el Motor de base de datosDatabase Engine intentó reducir.File identification number of the file the Motor de base de datosDatabase Engine tried to shrink.
CurrentSizeCurrentSize El número de páginas de 8 KB que el archivo ocupa actualmente.Number of 8-KB pages the file currently occupies.
MinimumSizeMinimumSize El número de páginas de 8 KB que el archivo podría ocupar, como mínimo.Number of 8-KB pages the file could occupy, at minimum. Esto corresponde al tamaño mínimo o tamaño de creación original de un archivo.This corresponds to the minimum size or originally created size of a file.
UsedPagesUsedPages El número de páginas de 8 KB que utiliza actualmente el archivo.Number of 8-KB pages currently used by the file.
EstimatedPagesEstimatedPages El número de páginas de 8 KB al que el Motor de base de datosDatabase Engine estima que se puede reducir el archivo.Number of 8-KB pages that the Motor de base de datosDatabase Engine estimates the file could be shrunk down to.

Nota

El Motor de base de datosDatabase Engine no presenta filas para los archivos que no se reducen.The Motor de base de datosDatabase Engine does not display rows for those files not shrunk.

NotasRemarks

Nota

Actualmente, Azure SQL Data Warehouse no admite DBCC SHRINKDATABASE.Currently Azure SQL Data Warehouse does not support DBCC SHRINKDATABASE. No se recomienda ejecutar este comando, ya que se trata de una operación de uso intensivo de E/S y puede dejar el almacén de datos sin conexión.Running this command is not recommended as this is an i/o intensive operation and can take your data warehouse offline. Además, después de ejecutar este comando habrá implicaciones económicas para sus instantáneas del almacén de datos.In addition, there will be costing implications to your data warehouse snapshots after running this command.

Para reducir todos los archivos de datos y de registro de una base de datos específica, ejecute el comando DBCC SHRINKDATABASE.To shrink all data and log files for a specific database, execute the DBCC SHRINKDATABASE command. Para reducir un archivo de datos o de registro de cada vez para una base de datos específica, ejecute el comando DBCC SHRINKFILE.To shrink one data or log file at a time for a specific database, execute the DBCC SHRINKFILE command.

Para ver la cantidad actual de espacio disponible (sin asignar) en la base de datos, ejecute sp_spaceused.To view the current amount of free (unallocated) space in the database, run sp_spaceused.

Las operaciones SHRINKDATABASE pueden detenerse en cualquier momento del proceso y se conserva el trabajo completado hasta ese momento.DBCC SHRINKDATABASE operations can be stopped at any point in the process, and any completed work is retained.

El tamaño de la base de datos no puede ser menor que el tamaño mínimo de la base de datos.The database cannot be made smaller than the minimum size of the database. 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.The minimum size is the size specified when the database is originally created, or the last size explicitly set by using a file size changing operation such as DBCC SHRINKFILE or 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.For example, if a database is originally created with a size of 10 MB in size and grows to 100 MB, the smallest the database can be reduced to is 10 MB, even if all the data in the database has been deleted.

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.Running DBCC SHRINKDATABASE without specifying either the NOTRUNCATE option or the TRUNCATEONLY option is equivalent to running a DBCC SHRINKDATABASE operation with NOTRUNCATE followed by running a DBCC SHRINKDATABASE operation with 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.The database being shrunk does not have to be in single user mode; other users can be working in the database when it is shrunk. Esto incluye las bases de datos del sistema.This includes system databases.

No se puede reducir una base de datos mientras se está realizando una copia de seguridad de la misma.You cannot shrink a database while the database is being backed up. 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.Conversely, you cannot backup a database while a shrink operation on the database is in process.

Cómo funciona DBCC SHRINKDATABASEHow DBCC SHRINKDATABASE Works

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. DBCC SHRINKDATABASE shrinks data files on a per-file basis, but shrinks log files as if all the log files existed in one contiguous log pool. Los archivos se reducen siempre desde el final.Files are always shrunk from the end.

Suponga que una base de datos llamada mydb tiene un archivo de datos y dos archivos de registro.Assume a database named mydb with a data file and two log files. Los archivos de datos y de registro tienen 10 MB cada uno, y el archivo de datos contiene 6 MB de datos.The data and log files are 10 MB each and the data file contains 6 MB of data.

Para cada archivo, el Motor de base de datosDatabase Engine calcula un tamaño de destino.For each file, the Motor de base de datosDatabase Engine calculates a target size. Este es el tamaño al que se debe reducir el archivo.This is the size to which the file is to be shrunk. Cuando DBCC SHRINKDATABASE se especifica con target_percent, el Motor de base de datosDatabase Engine calcula el tamaño final para que quede target_percent de espacio disponible en el archivo tras la reducción.When DBCC SHRINKDATABASE is specified with target_percent, the Motor de base de datosDatabase Engine calculates target size to be the target_percent amount of space free in the file after shrinking. Por ejemplo, si establece el valor de target_percent en 25 para reducir mydb, el Motor de base de datosDatabase Engine calcula que el tamaño final del archivo de datos será de 8 MB (6 MB de datos más 2 MB de espacio disponible).For example, if you specify a target_percent of 25 for shrinking mydb, the Motor de base de datosDatabase Engine calculates the target size for the data file to be 8 MB (6 MB of data plus 2 MB of free space). Por tanto, el Motor de base de datosDatabase Engine 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, después, reduce el archivo.Therefore, the Motor de base de datosDatabase Engine moves any data from the last 2 MB of the data file to any free space in the first 8 MB of the data file and then shrinks the file.

Suponga que el archivo de datos de mydb contiene 7 MB de datos.Assume the data file of mydb contains 7 MB of data. Si se especifica un target_percent de 30, este archivo de datos se puede reducir al porcentaje libre de 30.Specifying a target_percent of 30 allows for this data file to be shrunk to the free percentage of 30. En cambio, si se especifica un target_percent de 40, no se reduce el archivo de datos porque el Motor de base de datosDatabase Engine no reducirá ningún archivo a un tamaño menor que el que los datos ocupan actualmente.However, specifying a target_percent of 40 does not shrink the data file because the Motor de base de datosDatabase Engine will not shrink a file to a size smaller than the data currently occupies. O lo que es lo mismo: 40 % de espacio disponible deseado + 70 % de datos en el archivo (7 MB de 10 MB) es mayor que 100 %.You can also think of this issue another way: 40 percent wanted free space + 70 percent full data file (7 MB out of 10 MB) is more than 100 percent. Como el porcentaje de espacio disponible deseado más el porcentaje actual ocupado por los datos supera el 100 % (en un 10 %), un target_size superior a 30 no reducirá el archivo de datos.Because the percentage free that is wanted plus the current percentage that the data file occupies is over 100 percent (by 10 percent), any target_size greater than 30 will not shrink the data file.

En los archivos de registro, el Motor de base de datosDatabase Engine usa el parámetro target_percent para calcular el tamaño final de todo el registro, de forma que target_percent es la cantidad de espacio disponible en el registro después de la operación de reducción.For log files, the Motor de base de datosDatabase Engine uses target_percent to calculate the target size for the whole log; therefore, target_percent is the amount of free space in the log after the shrink operation. El tamaño final del registro entero se traduce al tamaño final de cada archivo de registro.Target size for the whole log is then translated to a target size for each log file.

DBCC SHRINKDATABASE intenta reducir cualquier archivo de registro físico a su tamaño final de forma inmediata.DBCC SHRINKDATABASE tries to shrink each physical log file to its target size immediately. 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.If no part of the logical log resides in the virtual logs beyond the target size of the log file, the file is successfully truncated and DBCC SHRINKDATABASE finishes without any messages. 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 datosDatabase Engine libera tanto espacio como sea posible y a continuación emite un mensaje informativo.However, if part of the logical log resides in the virtual logs beyond the target size, the Motor de base de datosDatabase Engine frees as much space as possible, and then issues an informational message. 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.The message describes what actions are required to move the logical log out of the virtual logs at the end of the file. Después de que se realizan estas acciones, se puede utilizar DBCC SHRINKDATABASE para liberar el espacio restante.After the actions are performed, DBCC SHRINKDATABASE can be used to free the remaining space.

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.Because a log file can only be shrunk to a virtual log file boundary, shrinking a log file to a size smaller than the size of a virtual log file might not be possible, even if it is not being used. El Motor de base de datosDatabase Engine elige dinámicamente el tamaño del archivo de registro virtual cuando se crean o se extienden archivos de registro.The size of the virtual log file is chosen dynamically by the Motor de base de datosDatabase Engine when log files are created or extended.

Procedimientos recomendadosBest Practices

Tenga en cuenta la siguiente información cuando vaya a reducir una base de datos:Consider the following information when you plan to shrink a database:

  • 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.A shrink operation is most effective after an operation that creates lots of unused space, such as a truncate table or a drop table operation.
  • La mayoría de las bases de datos requieren que haya espacio disponible para realizar las operaciones diarias normales.Most databases require some free space to be available for regular day-to-day operations. 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.If you shrink a database repeatedly and notice that the database size grows again, this indicates that the space that was shrunk is required for regular operations. En estos casos, no sirve reducir la base de datos reiteradamente.In these cases, repeatedly shrinking the database is a wasted operation.
  • 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.A shrink operation does not preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Esta es otra razón para no reducir la base de datos reiteradamente.This is another reason not to repeatedly shrink the database.
  • A menos que tenga un requisito específico, no establezca la opción de base de datos AUTO_SHRINK en ON.Unless you have a specific requirement, do not set the AUTO_SHRINK database option to ON.

Solucionar problemasTroubleshooting

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.It is possible for shrink operations to be blocked by a transaction that is running under a row versioning-based isolation level. 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.For example, if a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed, the shrink operation will wait for the delete operation to complete before shrinking the files. 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 ServerSQL Server cada cinco minutos durante la primera hora, y cada hora sucesivamente. When this happens, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE) to the SQL ServerSQL Server error log every five minutes in the first hour and then every hour after that. Por ejemplo, si el registro de errores contiene el siguiente mensaje de error:For example, if the error log contains the following error message:

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.This means that the shrink operation is blocked by snapshot transactions that have timestamps older than 109, which is the last transaction that the shrink operation completed. 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 de 15.It also indicates that the transaction_sequence_num, or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamic management view contains a value of 15. Si las columnas transaction_sequence_num o first_snapshot_sequence_num contienen 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.If either the transaction_sequence_num, or first_snapshot_sequence_num columns in the view contains a number that is less than the last transaction completed by a shrink operation (109), the shrink operation will wait for those transactions to finish.

Para resolver el problema, puede llevar a cabo una de las tareas siguientes:To resolve the problem, you can do one of the following tasks:

  • Finalizar la transacción que está bloqueando la operación de reducción.Terminate the transaction that is blocking the shrink operation.
  • Finalizar la operación de reducción.Terminate the shrink operation. Se conservará todo el trabajo completado.Any completed work is retained.
  • No hacer nada y permitir que la operación de reducción espere a que finalice la transacción que la está bloqueando.Do nothing and allow the shrink operation to wait until the blocking transaction completes.

PermisosPermissions

Debe pertenecer al rol fijo de servidor sysadmin o al rol fijo de base de datos db_owner .Requires membership in the sysadmin fixed server role or the db_owner fixed database role.

EjemplosExamples

A.A. Reducir una base de datos y especificar un porcentaje de espacio disponibleShrinking a database and specifying a percentage of free space

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.The following example decreases the size of the data and log files in the UserDB user database to allow for 10 percent free space in the database.

DBCC SHRINKDATABASE (UserDB, 10);  
GO  

B.B. Truncar una base de datosTruncating a database

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.The following example shrinks the data and log files in the AdventureWorks sample database to the last allocated extent.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);  

Vea tambiénSee also

ALTER DATABASE (Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)DBCC SHRINKFILE (Transact-SQL)
Reducir una base de datosShrink a Database