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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Reduce el tamaño especificado de los datos o del archivo de registro de la base de datos actual.Shrinks the current database's specified data or log file size. Puede usarlo para mover datos de un archivo a otros del mismo grupo, lo que vacía el archivo y permite la eliminación de su base de datos.You can use it to move data from one file to other files in the same filegroup, which empties the file and allows for its database removal. Puede reducir un archivo a menos de su tamaño de creación y restablecer el tamaño mínimo de archivo al nuevo valor.You can shrink a file to less than its size at creation, resetting the minimum file size to the new value.

Icono de vínculo de artículo Convenciones de sintaxis de Transact-SQLArticle 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
Nombre lógico del archivo que se va a reducir.The file to be shrunk's logical name.

file_idfile_id
Número de identificación (Id.) del archivo que se va a reducir.The file to be shrunk's identification (ID) number. Para obtener un identificador de archivo, use la función del sistema FILE_IDEX o consulte la vista de catálogo sys.database_files en la base de datos actual.To get a file ID, use the FILE_IDEX system function or query the sys.database_files catalog view in the current database.

target_sizetarget_size
Un entero: el nuevo tamaño en megabytes del archivo.An integer - the file's new megabyte size. Si no se especifica, DBCC SHRINKFILE reduce hasta el tamaño de creación del archivo.If not specified, DBCC SHRINKFILE reduces to the file creation size.

Nota

Puede reducir el tamaño predeterminado de un archivo vacío mediante DBCC SHRINKFILE target_size.You can reduce an empty file's default size 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 isn't supported for FILESTREAM filegroup containers.
Si se especifica, DBCC SHRINKFILE intenta reducir el archivo a target_size.If specified, DBCC SHRINKFILE tries to shrink the file to target_size. Las páginas usadas en el área del archivo que se va a liberar se mueven al espacio disponible en las áreas conservadas del archivo.Used pages in the file's area to be freed are moved to free space in the file's kept areas. Por ejemplo, con un archivo de datos de 10 MB, una operación DBCC SHRINKFILE con un valor de target_size de 8 mueve todas las páginas usadas en los 2 últimos MB del archivo a cualquier página sin asignar de los primeros 8 MB del archivo.For example, with a 10-MB data file, a DBCC SHRINKFILE operation with an 8 target_size moves all used pages in the file's last 2 MB into any unallocated pages in the file's first 8 MB. DBCC SHRINKFILE no reduce un archivo más allá del tamaño necesario de los datos almacenados.DBCC SHRINKFILE doesn't shrink a file past the needed stored data size. Por ejemplo, si se usan 7 MB de un archivo de datos de 10 MB, una instrucción DBCC SHRINKFILE con un parámetro 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 del archivo especificado a otros archivos del mismo grupo de archivos.Migrates all data from the specified file to other files in the same filegroup. Es decir, EMPTYFILE migra los datos de un archivo especificado a otros archivos del mismo grupo de archivos.In other words, EMPTYFILE migrates data from a specified file to other files in the same filegroup. EMPTYFILE garantiza que no se agregan nuevos datos al archivo, a pesar de que este archivo no sea de solo lectura.EMPTYFILE assures you that no new data gets added to the file, despite this file not being read-only. Puede usar la instrucción ALTER DATABASE para quitar un archivo.You can use the ALTER DATABASE statement to remove a file. Si usa la instrucción ALTER DATABASE para cambiar el tamaño del archivo, la marca de solo lectura se restablece y se pueden agregar datos.If you use the ALTER DATABASE statement to change file size, the read-only flag is reset and data can be added.

Para los contenedores del grupo de archivos FILESTREAM, no se puede usar ALTER DATABASE para quitar un archivo 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, you can't use ALTER DATABASE to remove a file until the FILESTREAM Garbage Collector has run and deleted all the unnecessary filegroup container files that EMPTYFILE has copied to another container. Para más información,vea sp_filestream_force_garbage_collection (Transact-SQL).For more information, see sp_filestream_force_garbage_collection (Transact-SQL)

Nota

Para más información sobre cómo quitar un contenedor de FILESTREAM, vea la sección correspondiente en Opciones File y Filegroup de ALTER DATABASE (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 desde el final de un archivo de datos hasta las páginas sin asignar de la parte delantera del archivo con o sin la especificación de target_percent.Moves allocated pages from a data file's end to unallocated pages in a file's front with or without specifying target_percent. El espacio disponible al final del archivo no se devuelve al sistema operativo y el tamaño físico del archivo no cambia.The free space at the file's end isn't returned to the operating system, and the file's physical size does not change. Por tanto, si se especifica NOTRUNCATE, parecerá que el archivo no se reduce.Therefore, if 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 isn't supported for FILESTREAM filegroup containers.

TRUNCATEONLYTRUNCATEONLY
Libera al sistema operativo todo el espacio disponible al final del archivo, pero no realiza ningún movimiento de página dentro del archivo.Releases all free space at the file's end 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 isn't 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 siguiente tabla se describen las columnas de conjunto de resultados.The following table describes result set columns.

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.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. Este número corresponde al tamaño mínimo o tamaño de creación original de un archivo.This number 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.

NotasRemarks

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

Puede detener las operaciones DBCC SHRINKFILE en cualquier momento sin que por ello se pierda el trabajo ya completado.You can stop DBCC SHRINKFILE operations at any point and any completed work is preserved. Si usa el parámetro EMPTYFILE y cancela la operación, el archivo no se marca para evitar que se agreguen datos adicionales.If you use the EMPTYFILE parameter and cancel the operation, the file isn't marked to prevent additional data from being added.

Cuando una operación DBCC SHRINKFILE no es correcta, se genera un error.When a DBCC SHRINKFILE operation fails, an error is raised.

Otros usuarios pueden trabajar en la base de datos durante la reducción de archivos: la base de datos no tiene que estar en modo de usuario único.Other users can work in the database during file shrinking - the database doesn't have to be in single-user mode. No es necesario ejecutar la instancia de SQL ServerSQL Server en modo de usuario único para reducir las bases de datos del sistema.You don't have to run the instance of SQL ServerSQL Server in single-user mode to shrink the system databases.

Reducción de un archivo de registroShrinking a log file

En los archivos de registro, Motor de base de datosDatabase Engine usa target_size para calcular el tamaño de destino completo del registro.For log files, the Motor de base de datosDatabase Engine uses target_size to calculate the whole log's target size. Por lo tanto, target_size es el espacio disponible del registro después de la operación de reducción.Therefore, target_size is the log's free space after the shrink operation. El tamaño de destino completo del registro se convierte en el tamaño de destino de cada archivo de registro.The whole log's target size is then translated to each log file's target size. 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 hasta el 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 isn't being used. Motor de base de datosDatabase Engine elige dinámicamente el tamaño del registro de archivo virtual cuando se crean o extienden los archivos de registro.The Motor de base de datosDatabase Engine dynamically chooses the virtual file log size 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:

  • Una reducción es más efectiva después de una operación con la que se crea mucho espacio no utilizado, como por ejemplo, una operación para truncar o eliminar tablas.A shrink operation is most effective after an operation that creates a large amount 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 available free space for regular day-to-day operations. Si reduce una base de datos reiteradamente y su tamaño vuelve a aumentar, es probable que las operaciones normales requieran el espacio reducido.If you shrink a database repeatedly and its size grows again, then it's likely that regular operations require the shrunk space. 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 doesn't preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Esta fragmentación es otra razón para no reducir la base de datos reiteradamente.This fragmentation 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 bloqueo y conducir a retrasos.Contention on system tables can cause blocking and lead to delays.

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 reduce.The file doesn't shrink

Si el tamaño del archivo no cambia después de una operación de reducción sin errores, pruebe lo siguiente para comprobar que el archivo tiene suficiente espacio libre:If the file size doesn't change after an error-less shrink operation, try the following to verify that the file has adequate free space:

  • 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 comando DBCC SQLPERF para devolver el espacio ocupado 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.The shrink operation can't reduce the file size any further if there's insufficient free space available.

Normalmente es el archivo de registro el que parece no reducirse.Typically it's the log file that appears not to shrink. Esta falta de reducción suele ser el resultado de un archivo de registro que no se ha truncado.This non-shrinking is usually the result of a log file that hasn't been truncated. Para truncar el registro, puede establecer el modelo de recuperación de la base de datos en SIMPLE o realizar una copia de seguridad del registro y ejecutar luego de nuevo la operación DBCC SHRINKFILE.To truncate the log, you can set the database recovery model to SIMPLE, or back up the log and then run the DBCC SHRINKFILE operation again.

La operación de reducción está bloqueadaThe shrink operation is blocked

Una transacción que se ejecuta con un nivel de aislamiento basado en las versiones de fila puede bloquear las operaciones de reducción.A transaction running under a row versioning-based isolation level can block shrink operations. 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 espera a que la operación de eliminación finalice antes de continuar.For example, if a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation executes, the shrink operation waits for the delete to complete before continuing. Cuando este bloqueo se produce, 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.When this blocking 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. Este mensaje se registra cada cinco minutos durante la primera hora y luego cada hora.This message is logged every five minutes in the first hour and then every hour. 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.  

Este mensaje significa que las transacciones de instantáneas con marcas de tiempo anteriores a 109 (la última transacción que realizó la operación de reducción) están bloqueando la operación de reducción.This message means snapshot transactions with timestamps older than 109 (the last transaction that the shrink operation completed) are blocking the shrink operation. 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 contienen el valor 15.It also indicates 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 las columnas de vista transaction_sequence_num o first_snapshot_sequence_num contienen un número inferior al de la última transacción realizada mediante una operación de reducción (109), la operación de reducción espera a que esas transacciones finalicen.If either the transaction_sequence_num or first_snapshot_sequence_num view column contains a number less than a shrink operation's last completed transaction (109), the shrink operation waits 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 bloquea la operación de reducciónEnd the transaction that is blocking the shrink operation.
  • Finalizar la operación de reducciónEnd the shrink operation. Si finaliza la operación de reducción, se mantiene todo el trabajo completado.Any completed work is kept if the shrink operation ends.
  • 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

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 de la base de datos de usuario UserDB 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  

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 cómo vaciar un archivo de forma que se pueda quitar de la base de datos.The following example demonstrates emptying a file so it can be removed from the database. Para los fines de este ejemplo, primero se crea un archivo de datos que contiene datos.For this example's purposes, a data file is first created and 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  

Consulte 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