DBCC SHRINKFILE (Transact-SQL)DBCC SHRINKFILE (Transact-SQL)

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

Reduce el tamaño del archivo de datos o de registro para la base de datos actual, o vacía un archivo moviendo los datos del archivo especificado a otros archivos del mismo grupo, lo que permite quitar el archivo de la base de datos.Shrinks the size of the specified data or log file for the current database, or empties a file by moving the data from the specified file to other files in the same filegroup, allowing the file to be removed from the database. Puede reducir un archivo a un tamaño menor que el tamaño especificado cuando se creó.You can shrink a file to a size that is less than the size specified when it was created. Así se restablece el tamaño mínimo de archivo al valor nuevo.This resets the minimum file size to the new value.

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

SintaxisSyntax


DBCC SHRINKFILE   
(  
    { file_name | file_id }   
    { [ , EMPTYFILE ]   
    | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]  
    }  
)  
[ WITH NO_INFOMSGS ]  

ArgumentosArguments

file_namefile_name
Es el nombre lógico del archivo que se va a reducir.Is the logical name of the file to be shrunk.

file_IDfile_id
Es el número de identificación (Id.) del archivo que se va a reducir.Is the identification (ID) number of the file to be shrunk. Para obtener un identificador de archivo, utilice la FILE_IDEX función del sistema o consulta el sys.database_files vista en la base de datos de catálogo.To obtain a file ID, use the FILE_IDEX system function or query the sys.database_files catalog view in the current database.

target_sizetarget_size
Es el tamaño para el archivo, en megabytes, expresado como un número entero.Is the size for the file in megabytes, expressed as an integer. Si no se especifica, DBCC SHRINKFILE reduce el tamaño al predeterminado del archivo.If not specified, DBCC SHRINKFILE reduces the size to the default file size. El tamaño predeterminado es el que se especificó cuando se creó el archivo.The default size is the size specified when the file was created.

Nota

Puede reducir el tamaño predeterminado de un archivo vacío utilizando DBCC SHRINKFILE target_size.You can reduce the default size of an empty file by using DBCC SHRINKFILE target_size. Por ejemplo, si crea un archivo de 5 MB y, a continuación, reduce el archivo a 3 MB mientras el archivo todavía está vacío, el tamaño de archivo predeterminado se establece en 3 MB.For example, if you create a 5-MB file and then shrink the file to 3 MB while the file is still empty, the default file size is set to 3 MB. Esto solo se aplica para vaciar archivos que nunca han contenido datos.This applies only to empty files that have never contained data.

Esta opción no se admite para los contenedores del grupo de archivos FILESTREAM.This option is not supported for FILESTREAM filegroup containers.
Si target_size se especifica, DBCC SHRINKFILE intenta reducir el archivo al tamaño especificado.If target_size is specified, DBCC SHRINKFILE tries to shrink the file to the specified size. Las páginas utilizadas de la parte del archivo que se va a liberar se vuelven a ubicar en el espacio disponible de la parte del archivo que se va a mantener.Used pages in the part of the file to be freed are relocated to available free space in the part of the file retained. Por ejemplo, si hay un archivo de datos de 10 MB, una operación DBCC SHRINKFILE con un target_size 8 hace todas las páginas usadas en los últimos 2 MB del archivo se asignen de nuevo en las páginas no asignadas en los primeros 8 MB del archivo.For example, if there is a 10-MB data file, a DBCC SHRINKFILE operations with a target_size of 8 causes all used pages in the last 2 MB of the file to be reallocated into any unallocated pages in the first 8 MB of the file. DBCC SHRINKFILE no reduce un archivo a un tamaño menor que el que se necesita para almacenar los datos en el archivo.DBCC SHRINKFILE does not shrink a file past the size needed to store the data in the file. Por ejemplo, si se utilizan 7 MB de un archivo de datos de 10 MB, una instrucción DBCC SHRINKFILE con un target_size de 6 reduce el archivo a 7 MB, no 6 MB.For example, if 7 MB of a 10-MB data file is used, a DBCC SHRINKFILE statement with a target_size of 6 shrinks the file to only 7 MB, not 6 MB.

EMPTYFILEEMPTYFILE
Migra todos los datos desde el archivo especificado a otros archivos en el mismo grupo de archivos.Migrates all data from the specified file to other files in the same filegroup. En otras palabras, EmptyFile migrará los datos desde el archivo especificado a otros archivos en el mismo grupo de archivos.In other words, EmptyFile will migrate the data from the specified file to other files in the same filegroup. Emptyfile garantiza que no hay nuevos datos se agregarán al archivo. El archivo se puede quitar mediante la ALTER DATABASE instrucción.Emptyfile assures you that no new data will be added to the file.The file can be removed by using the ALTER DATABASE statement. Para los contenedores del grupo de archivos FILESTREAM, no se puede quitar el archivo mediante ALTER DATABASE hasta que el recopilador de elementos no utilizados de FILESTREAM haya ejecutado y eliminado todos los archivos innecesarios del contenedor del grupo de archivos que EMPTYFILE ha copiado en otro contenedor.For FILESTREAM filegroup containers, the file cannot be removed using ALTER DATABASE until the FILESTREAM Garbage Collector has run and deleted all the unnecessary filegroup container files that EMPTYFILE has copied to another container. Para obtener más información, consulte sp_filestream_force_garbage_collection ( Transact-SQL )For more information, see sp_filestream_force_garbage_collection (Transact-SQL)

Nota

Para obtener información acerca de cómo quitar un contenedor de FILESTREAM, vea la sección correspondiente en modificar el archivo de base de datos y opciones de grupo de archivos ( Transact-SQL )For information on removing a FILESTREAM container, see the corresponding section in ALTER DATABASE File and Filegroup Options (Transact-SQL)

NOTRUNCATENOTRUNCATE
Mueve las páginas asignadas del final de un archivo de datos a páginas no asignadas del principio del archivo con o sin especificar porcentaje deseado.Moves allocated pages from the end of a data file to unallocated pages in the front of the file with or without specifying target_percent. 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 el archivo no se reduce.Therefore, when NOTRUNCATE is specified, the file appears not to shrink. NOTRUNCATE solo es aplicable a archivos de datos.NOTRUNCATE is applicable only to data files. No afecta a los archivos de registro.The log files are not affected. Esta opción no se admite para los contenedores del grupo de archivos FILESTREAM.This option is not supported for FILESTREAM filegroup containers.

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_size se omite si se especifica con TRUNCATEONLY.target_size is ignored if specified with TRUNCATEONLY.
La opción TRUNCATEONLY no mueve la información en el registro, pero quita VLF inactivos del final del archivo de registro.The TRUNCATEONLY option does not move information in the log, but does remove inactive VLFs from the end of the log file. Esta opción no se admite para los contenedores del grupo de archivos FILESTREAM.This option is not supported for FILESTREAM filegroup containers.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Suprime todos los mensajes de información.Suppresses all informational messages.

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 DescriptionDescription
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 El número de identificación de archivo del archivo de la Motor de base de datosDatabase Engine intentó reducir.The 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.

ComentariosRemarks

DBCC SHRINKFILE se aplica a los archivos de la base de datos actual.DBCC SHRINKFILE applies to the files in the current database. Para obtener más información sobre cómo cambiar la base de datos actual, vea usar ( Transact-SQL ) .For more information about how to change the current database, see USE (Transact-SQL).

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

Cuando se produce un error en una operación DBCC SHRINKFILE, se produce un error.When a DBCC SHRINKFILE operation fails, an error is raised.

La base de datos que se está reduciendo no tiene por qué estar en modo de usuario único; otros usuarios pueden estar trabajando en la base de datos cuando el archivo 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 the file is shrunk. No es necesario ejecutar SQL ServerSQL Server en modo de usuario único para reducir las bases de datos del sistema.You do not have to run the instance of SQL ServerSQL Server in single-user mode to shrink the system databases.

Reducir un archivo de registroShrinking a Log File

Para los archivos de registro, el Motor de base de datosDatabase Engine utiliza target_size para calcular el tamaño final del registro entero; por lo tanto, target_size es la cantidad de espacio libre en el registro después de la operación de reducción.For log files, the Motor de base de datosDatabase Engine uses target_size to calculate the target size for the whole log; therefore, target_size is the amount of free space in the log after the shrink operation. El tamaño final del registro entero se traduce, entonces, en el tamaño final de cada archivo de registro.Target size for the whole log is then translated to target size for each log file. DBCC SHRINKFILE intenta reducir cualquier archivo de registro físico a su tamaño final de forma inmediata.DBCC SHRINKFILE tries to shrink each physical log file to its target size immediately. 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. Una vez realizadas estas acciones, se puede usar DBCC SHRINKFILE para liberar el espacio restante.After the actions are performed, DBCC SHRINKFILE 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 tamaño del archivo de registro virtual se elige dinámicamente el Motor de base de datosDatabase Engine cuando se crean o se extienden los 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 un archivo:Consider the following information when you plan to shrink a file:

  • 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.
  • Reduzca varios archivos en la misma base de datos de forma secuencial en lugar de simultáneamente.Shrink multiple files in the same database sequentially instead of concurrently. La contención en las tablas del sistema puede provocar retrasos debido al bloqueo.Contention on system tables can cause delays due to blocking.

Solucionar problemasTroubleshooting

En esta sección se describe el modo de diagnosticar y corregir los problemas que pueden ocurrir al ejecutar el comando DBCC SHRINKFILE:This section describes how to diagnose and correct issues that can occur when running the DBCC SHRINKFILE command.

El archivo no se reduceThe File Does Not Shrink

Si la operación de reducción se ejecuta sin errores, pero parece que el archivo no ha cambiado de tamaño, compruebe que el archivo tiene espacio disponible para quitar realizando una de las siguientes operaciones:If the shrink operation runs without error, but the file does not appear to have changed in size, verify that the file has adequate free space to remove by performing one of the following operations:

  • Ejecute la siguiente consulta.Run the following query.
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
  • Ejecute el DBCC SQLPERF comando para devolver el espacio utilizado en el registro de transacciones.Run the DBCC SQLPERF command to return the space used in the transaction log.
    Si no hay suficiente espacio disponible, la operación de reducción no puede reducir más el tamaño del archivo.If insufficient free space is available, the shrink operation cannot reduce the file size any further.

Normalmente es el archivo de registro el que parece no reducirse.Typically it is the log file that appears not to shrink. Esto suele deberse a que dicho archivo no se ha truncado.This is usually the result of a log file that has not been truncated. Puede truncar el registro estableciendo el modelo de recuperación de la base de datos en SIMPLE o realizando una copia de seguridad del registro y ejecutando a continuación la operación DBCC SHRINKFILE nuevamente.You can truncate the log by setting the database recovery model to SIMPLE, or by backing up the log and then running the DBCC SHRINKFILE operation again.

La operación de reducción está bloqueadaThe Shrink Operation Is Blocked

Es posible que las operaciones de reducción estar bloqueado por una transacción que se está ejecutando un nivel de aislamiento basado en las 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 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 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, se producirá el siguiente error:For example, if the error log contains the following error message then the following error will occur:

DBCC SHRINKFILE for file ID 1 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 la transaction_sequence_num, o first_snapshot_sequence_num columnas en la sys.dm_tran_active_snapshot_database_transactions vista de administración dinámica contiene un 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 dynamic management view contains a value of 15. Si el transaction_sequence_num, o first_snapshot_sequence_num columnas de la vista contiene un número menor que la última transacción completada mediante una operación de reducción (109), el reducir operació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 issue, 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. Si finaliza la operación de reducción, se conservará todo el trabajo completado.If the shrink operation is terminated, 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.

PermissionsPermissions

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 un archivo de datos a un tamaño final especificadoShrinking a data file to a specified target size

En el siguiente ejemplo se reduce el tamaño de un archivo de datos denominado DataFile1 en el UserDB base de datos de usuario a 7 MB.The following example shrinks the size of a data file named DataFile1 in the UserDB user database to 7 MB.

USE UserDB;  
GO  
DBCC SHRINKFILE (DataFile1, 7);  
GO  

B.B. Reducir un archivo de registro a un tamaño final especificadoShrinking a log file to a specified target size

En el ejemplo siguiente se reduce el archivo de registro de la base de datos AdventureWorks a 1 MB.The following example shrinks the log file in the AdventureWorks database to 1 MB. Para permitir que el comando DBCC SHRINKFILE reduzca el archivo, primero hay que truncar el archivo estableciendo el modelo de recuperación de la base de datos en SIMPLE.To allow the DBCC SHRINKFILE command to shrink the file, the file is first truncated by setting the database recovery model to SIMPLE.

USE AdventureWorks2012;  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.  
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY FULL;  
GO  

C.C. Truncar un archivo de datosTruncating a data file

En el ejemplo siguiente se trunca el archivo de datos principal en la base de datos AdventureWorks.The following example truncates the primary data file in the AdventureWorks database. Se consulta la vista de catálogo sys.database_files para obtener el valor de file_id del archivo de datos.The sys.database_files catalog view is queried to obtain the file_id of the data file.

USE AdventureWorks2012;  
GO  
SELECT file_id, name  
FROM sys.database_files;  
GO  
DBCC SHRINKFILE (1, TRUNCATEONLY);  

D.D. Vaciar un archivoEmptying a file

En el ejemplo siguiente se ilustra el procedimiento para vaciar un archivo de forma que se pueda quitar de la base de datos.The following example demonstrates the procedure for emptying a file so that it can be removed from the database. Para los fines de este ejemplo, se crea primero un archivo de datos y se supone que el archivo contiene datos.For the purposes of this example, a data file is first created and it is assumed that the file contains data.

USE AdventureWorks2012;  
GO  
-- Create a data file and assume it contains data.  
ALTER DATABASE AdventureWorks2012   
ADD FILE (  
    NAME = Test1data,  
    FILENAME = 'C:\t1data.ndf',  
    SIZE = 5MB  
    );  
GO  
-- Empty the data file.  
DBCC SHRINKFILE (Test1data, EMPTYFILE);  
GO  
-- Remove the data file from the database.  
ALTER DATABASE AdventureWorks2012  
REMOVE FILE Test1data;  
GO  

Vea tambiénSee Also

ALTER DATABASE (Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)DBCC SHRINKDATABASE (Transact-SQL)
File_ID ( Transact-SQL )FILE_ID (Transact-SQL)
sys.database_files (Transact-SQL)sys.database_files (Transact-SQL)
Reducir un archivoShrink a File