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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Эта инструкция позволяет сжать указанный файл данных или журнала в текущей базе данных.Shrinks the current database's specified data or log file size. С помощью инструкции можно переместить данные из одного файла в другие файлы в той же файловой группе, одновременно очищая файл и разрешая его удаление из базы данных.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. Вы можете сжать файл до меньшего размера, чем при создании, указав новое значение для минимального размера файла.You can shrink a file to less than its size at creation, resetting the minimum file size to the new value.

Значок ссылки на статью Синтаксические обозначения в Transact-SQLArticle link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

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

АргументыArguments

file_namefile_name
Логическое имя файла, предназначенного для сжатия.The file to be shrunk's logical name.

file_idfile_id
Идентификационный номер (идентификатор) файла, предназначенного для сжатия.The file to be shrunk's identification (ID) number. Чтобы получить идентификатор файла, используйте системную функцию FILE_IDEX или выполните запрос к представлению каталога sys.database_files в текущей базе данных.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
Целое число, которое обозначает новый размер файла в мегабайтах.An integer - the file's new megabyte size. Если значение не указано, инструкция DBCC SHRINKFILE уменьшает файл до его размера при создании.If not specified, DBCC SHRINKFILE reduces to the file creation size.

Примечание

Размер пустого файла по умолчанию можно уменьшить с помощью инструкции DBCC SHRINKFILE target_size.You can reduce an empty file's default size using DBCC SHRINKFILE target_size. Например, при создании файла с размером 5 МБ и последующем уменьшении размера до 3 МБ, в то время как файл остается пустым, размер файла по умолчанию задается равным 3 МБ.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. Это правило применимо только к пустым файлам, в которых никогда не содержались данные.This applies only to empty files that have never contained data.

Контейнеры файловых групп FILESTREAM не поддерживают этот параметр.This option isn't supported for FILESTREAM filegroup containers.
Если он указан, то инструкция DBCC SHRINKFILE пытается сжать файл до размера target_size.If specified, DBCC SHRINKFILE tries to shrink the file to target_size. Используемые страницы в освобождаемой области файла перемещаются в свободное пространство в сохраняемых областях файла.Used pages in the file's area to be freed are moved to free space in the file's kept areas. Например, для файла данных размером 10 МБ при операции DBCC SHRINKFILE с target_size 8 все используемые страницы будут перемещены из последних 2 МБ файла на произвольные нераспределенные страницы в первых 8 МБ этого же файла.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 не сжимает файл не более, чем это нужно для хранимых данных.DBCC SHRINKFILE doesn't shrink a file past the needed stored data size. Например, если в файле данных, размер которого составляет 10 МБ, используется 7 МБ, инструкция DBCC SHRINKFILE со значением аргумента target_size, равным 6, сжимает файл только до 7 МБ, а не до 6 МБ.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
Переносит все данные из указанного файла в другие файлы в той же файловой группе.Migrates all data from the specified file to other files in the same filegroup. Другими словами, EMPTYFILE переносит данные из указанного файла в другие файлы в той же файловой группе.In other words, EMPTYFILE migrates data from a specified file to other files in the same filegroup. EMPTYFILE гарантирует, что новые данные не будут добавлены в файл, даже если в него разрешена запись.EMPTYFILE assures you that no new data gets added to the file, despite this file not being read-only. Для удаления файла можно использовать инструкцию ALTER DATABASE.You can use the ALTER DATABASE statement to remove a file. Если с помощью инструкции ALTER DATABASE изменяется размер файла, флаг "только для чтения" сбрасывается, позволяя добавлять данные.If you use the ALTER DATABASE statement to change file size, the read-only flag is reset and data can be added.

В контейнерах файловых групп FILESTREAM нельзя удалить файл с помощью ALTER DATABASE до тех пор, пока не будет выполнен сборщик мусора FILESTREAM, который удалит все ненужные файлы в контейнере файловых групп, скопированные в другой контейнер с помощью EMPTYFILE.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. Дополнительные сведения см. в статье sp_filestream_force_garbage_collection (Transact-SQL)For more information, see sp_filestream_force_garbage_collection (Transact-SQL)

Примечание

Сведения об удалении контейнера FILESTREAM см. в соответствующем разделе в статье Параметры инструкции 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
Позволяет переместить распределенные страницы из конца файла данных на нераспределенные страницы в начале файла с указанием или без указания 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. Свободное место в конце файла не возвращается операционной системе, а физический размер файла не изменяется.The free space at the file's end isn't returned to the operating system, and the file's physical size does not change. Таким образом, если указан аргумент NOTRUNCATE, сжатие файла незаметно.Therefore, if NOTRUNCATE is specified, the file appears not to shrink. Аргумент NOTRUNCATE применим только к файлам данных.NOTRUNCATE is applicable only to data files. На файлы журнала он не влияет.The log files are not affected. Контейнеры файловых групп FILESTREAM не поддерживают этот параметр.This option isn't supported for FILESTREAM filegroup containers.

TRUNCATEONLYTRUNCATEONLY
Возвращает операционной системе все свободное пространство в конце файла, но не перемещает страницы внутри файла.Releases all free space at the file's end to the operating system but does not perform any page movement inside the file. Файл данных сокращается только до последнего выделенного экстента.The data file is shrunk only to the last allocated extent. Аргумент target_size не учитывается, если указан аргумент TRUNCATEONLY.target_size is ignored if specified with TRUNCATEONLY.
Параметр TRUNCATEONLY не переносит сведения в журнале, но удаляет неактивные VLF в конце файла журнала.The TRUNCATEONLY option does not move information in the log, but does remove inactive VLFs from the end of the log file. Контейнеры файловых групп FILESTREAM не поддерживают этот параметр.This option isn't supported for FILESTREAM filegroup containers.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Подавляет вывод всех информационных сообщений.Suppresses all informational messages.

Результирующие наборыResult sets

В приведенной ниже таблице описаны столбцы результирующего набора.The following table describes result set columns.

Имя столбцаColumn name ОписаниеDescription
DbIdDbId Идентификатор базы данных, файл которой компонент Компонент Database EngineDatabase Engine пытался сжать.Database identification number of the file the Компонент Database EngineDatabase Engine tried to shrink.
FileIdFileId Идентификационный номер файла, сжатие которого было предпринято компонентом Компонент Database EngineDatabase Engine.The file identification number of the file the Компонент Database EngineDatabase Engine tried to shrink.
CurrentSizeCurrentSize Количество 8-килобайтных страниц, занятых файлом в настоящее время.Number of 8-KB pages the file currently occupies.
MinimumSizeMinimumSize Минимальное количество 8-килобайтных страниц, которое может занимать файл.Number of 8-KB pages the file could occupy, at minimum. Это число соответствует минимальному размеру файла при его создании.This number corresponds to the minimum size or originally created size of a file.
UsedPagesUsedPages Количество 8-килобайтных страниц, используемых файлом в настоящее время.Number of 8-KB pages currently used by the file.
EstimatedPagesEstimatedPages Количество 8-килобайтных страниц, до которого можно было бы сжать файл по оценке компонента Компонент Database EngineDatabase Engine.Number of 8-KB pages that the Компонент Database EngineDatabase Engine estimates the file could be shrunk down to.

RemarksRemarks

Инструкция DBCC SHRINKFILE применяется к файлам в текущей базе данных.DBCC SHRINKFILE applies to the current database's files. Дополнительные сведения об изменении текущей базы данных см. в статье USE (Transact-SQL).For more information about how to change the current database, see USE (Transact-SQL).

Вы можете в любой момент остановить операцию DBCC SHRINKFILE, и вся выполненная работа сохранится.You can stop DBCC SHRINKFILE operations at any point and any completed work is preserved. Если вы отмените операцию, для которой указан параметр EMPTYFILE, маркировка файла, предотвращающая добавление новых данных, не устанавливается.If you use the EMPTYFILE parameter and cancel the operation, the file isn't marked to prevent additional data from being added.

В случае сбоя операции DBCC SHRINKFILE возникает ошибка.When a DBCC SHRINKFILE operation fails, an error is raised.

Во время сжатия файла в базе данных могут работать другие пользователи, то есть однопользовательский режим для базы данных не требуется.Other users can work in the database during file shrinking - the database doesn't have to be in single-user mode. Для сжатия системных баз данных не обязательно запускать экземпляр SQL ServerSQL Server в однопользовательском режиме.You don't have to run the instance of SQL ServerSQL Server in single-user mode to shrink the system databases.

Сжатие файла журналаShrinking a log file

Для файлов журнала с помощью Компонент Database EngineDatabase Engine вычисляется целевой размер всего журнала на основе target_size.For log files, the Компонент Database EngineDatabase Engine uses target_size to calculate the whole log's target size. Таким образом, target_size указывает размер свободного места в журнале после операции сжатия.Therefore, target_size is the log's free space after the shrink operation. Затем по заданному размеру всего журнала рассчитываются заданные размеры каждого файла журнала.The whole log's target size is then translated to each log file's target size. Инструкция DBCC SHRINKFILE сразу же пытается сжать каждый физический файл журнала до намеченного размера.DBCC SHRINKFILE tries to shrink each physical log file to its target size immediately. Однако если часть логического журнала хранится в виртуальных журналах за пределами заданного размера, то компонент Компонент Database EngineDatabase Engine освобождает как можно больше места, а затем формирует информационное сообщение.However, if part of the logical log resides in the virtual logs beyond the target size, the Компонент Database EngineDatabase Engine frees as much space as possible, and then issues an informational message. Сообщение описывает действия, которые необходимо предпринять, чтобы переместить логический журнал из виртуальных журналов в конец файла.The message describes what actions are required to move the logical log out of the virtual logs at the end of the file. После выполнения всех действий инструкция DBCC SHRINKFILE может быть использована для освобождения оставшегося пространства.After the actions are performed, DBCC SHRINKFILE can be used to free the remaining space.

Так как файл журнала можно сжать только до границы виртуального файла журнала, сжать файл журнала до меньшего размера, чем у виртуального файла журнала, нельзя, даже если он не используется.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. Компонент Компонент Database EngineDatabase Engine динамически выбирает размер виртуального файла журнала при его создании или расширении.The Компонент Database EngineDatabase Engine dynamically chooses the virtual file log size when log files are created or extended.

РекомендацииBest practices

Примите во внимание следующие сведения при планировании сжатия файла.Consider the following information when you plan to shrink a file:

  • Максимальный эффект от сжатия достигается после операции, при которой создается много неиспользуемого пространства, например после усечения или удаления таблицы.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.

  • Большинству баз данных для выполнения обычных ежедневных операций требуется некоторый объем свободного места.Most databases require some available free space for regular day-to-day operations. Если вы регулярно сжимаете базу данных, но ее размер постоянно увеличивается, скорее всего, освобождаемое пространство необходимо для обычной работы базы данных.If you shrink a database repeatedly and its size grows again, then it's likely that regular operations require the shrunk space. В таких случаях повторное сжатие базы данных бессмысленно.In these cases, repeatedly shrinking the database is a wasted operation.

  • Операция сжатия не исключает фрагментацию индексов в базе данных и даже, наоборот, приводит к усилению фрагментации.A shrink operation doesn't preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Фрагментация — это еще одна причина, по которой не стоит регулярно сжимать базу данных.This fragmentation is another reason not to repeatedly shrink the database.

  • Сжимайте несколько файлов в одной базе данных последовательно, а не одновременно.Shrink multiple files in the same database sequentially instead of concurrently. Состязание в системных таблицах может привести к задержке из-за блокировки.Contention on system tables can cause blocking and lead to delays.

Устранение неполадокTroubleshooting

Этот раздел описывает методы диагностики и устранения проблем, которые могут произойти при выполнении команды DBCC SHRINKFILE:This section describes how to diagnose and correct issues that can occur when running the DBCC SHRINKFILE command.

Файл не сжимаетсяThe file doesn't shrink

Если размер файла не изменяется после сжатия, которое было выполнено без ошибок, проверьте, есть свободное место в файле, с помощью следующей команды: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:

  • Выполните следующий запрос.Run the following query.
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
  • Выполните команду DBCC SQLPERF, чтобы освободить пространство, используемое журналом транзакций.Run the DBCC SQLPERF command to return the space used in the transaction log.

Если свободного пространства недостаточно, сжатие не поможет уменьшить размер файла.The shrink operation can't reduce the file size any further if there's insufficient free space available.

Чаще всего результаты сжатия незаметны для файлов журнала.Typically it's the log file that appears not to shrink. Такая несжимаемость характерна для неусеченных файлов журнала.This non-shrinking is usually the result of a log file that hasn't been truncated. Чтобы усечь файл журнала, установите значение SIMPLE для модели восстановления базы данных или создайте резервную копию журнала и снова выполните операцию 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.

Операция сжатия блокируетсяThe shrink operation is blocked

Транзакция, запущенная под уровнем изоляции с управлением версиями строк, может блокировать операции сжатия.A transaction running under a row versioning-based isolation level can block shrink operations. Например, если выполняется масштабная операция удаления под уровнем изоляции с управлением версиями строк, запущенная инструкция DBCC SHRINK DATABASE будет ожидать, пока завершится такая операция удаления, прежде чем приступить к сжатию файлов.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. При возникновении такой блокировки для операций DBCC SHRINKFILE и DBCC SHRINKDATABASE в журнале ошибок SQL Server выводится информационное сообщение (5202 для SHRINKDATABASE и 5203 для SHRINKFILE).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. Это сообщение регистрируется каждые 5 минут в течение первого часа, а затем по одному разу каждый часThis message is logged every five minutes in the first hour and then every hour. Например, если журнал ошибок содержит следующее сообщение об ошибке, произойдет следующая ошибка.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.  

Такое сообщение означает, что операция сжатия блокируется транзакциями с моментальным снимком, отметка времени которого старше, чем 109 (это последняя транзакция, завершенная операцией сжатия).This message means snapshot transactions with timestamps older than 109 (the last transaction that the shrink operation completed) are blocking the shrink operation. Также сообщение информирует, что столбец transaction_sequence_num или first_snapshot_sequence_num в динамическом административном представлении sys.dm_tran_active_snapshot_database_transactions содержит значение 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. Если столбец transaction_sequence_num или first_snapshot_sequence_num в представлении содержит меньшее число, чем последняя транзакция, выполненная операцией сжатия (109), то операция сжатия будет ждать завершения этих транзакций.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.

Разрешить эту проблему можно одним из следующих способов.To resolve the issue, you can do one of the following tasks:

  • Прервите выполнение транзакции, которая блокирует операцию сжатия.End the transaction that is blocking the shrink operation.
  • Прервите операцию сжатия.End the shrink operation. При прерывании операции сжатия вся уже выполненная работа сохраняется.Any completed work is kept if the shrink operation ends.
  • Пока операция сжатия ожидает завершения блокирующей транзакции, ничего делать не нужно.Do nothing and allow the shrink operation to wait until the blocking transaction completes.

РазрешенияPermissions

Необходимо быть членом предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner .Requires membership in the sysadmin fixed server role or the db_owner fixed database role.

ПримерыExamples

Сжатие файла данных до указанного целевого размераShrinking a data file to a specified target size

В приведенном ниже примере файл данных с именем DataFile1 в пользовательской базе данных UserDB сжимается до 7 МБ.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  

Сжатие файла журнала до указанного целевого размераShrinking a log file to a specified target size

В следующем примере файл журнала в базе данных AdventureWorks сжимается до 1 МБ.The following example shrinks the log file in the AdventureWorks database to 1 MB. Чтобы разрешить команде DBCC SHRINKFILE сжать файл, сначала необходимо усечь его, установив значение 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. Усечение файла данныхTruncating a data file

В следующем примере усекается первичный файл данных в базе данных AdventureWorks.The following example truncates the primary data file in the AdventureWorks database. Выполняется запрос к представлению каталога sys.database_files для получения идентификатора файла данных file_id.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. Очистка файлаEmptying a file

Следующий пример демонстрирует процедуру очистки файла для его удаления из базы данных.The following example demonstrates emptying a file so it can be removed from the database. Для этого примера сначала создается файл, содержащий данные.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  

См. также:See 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)
Сжатие файлаShrink a File