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

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

Сокращает размер файлов данных и файлов журнала в указанной базе данных.Shrinks the size of the data and log files in the specified database.

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

СинтаксисSyntax

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

АргументыArguments

имя_бд | ид_бд | 0database_name | database_id | 0
Имя или идентификатор базы данных, которая должна быть сжата.Is the database name or ID to be shrunk. Если указано значение 0, используется текущая база данных.0 specifies that the current database is used.

целевой_процентtarget_percent
Процент свободного пространства, которое должно остаться в базе данных после сжатия.Is the percentage of free space that you want left in the database file after the database has been shrunk.

NOTRUNCATENOTRUNCATE
Перемещает назначенные страницы с конца файла в неназначенные страницы в начале файла.Moves assigned pages from the file's end to unassigned pages in the front of the file. Это действие сжимает данные в файле.This action compacts the data within the file. Целевой_процент является необязательным.target_percent is optional. Хранилище данных SQL Azure не поддерживает этот параметр.Azure SQL Data Warehouse doesn't support this option.

Свободное место в конце файла не возвращается операционной системе, и физический размер файла не изменяется.The free space at the end of the file isn't returned to the operating system, and the physical size of the file doesn't change. Таким образом, база данных физически не уменьшается при указании NOTRUNCATE.As such, the database appears not to shrink when you specify NOTRUNCATE.

Аргумент NOTRUNCATE применим только к файлам данных.NOTRUNCATE is applicable only to data files. NONTRUNCATE не влияет на файл журнала.NONTRUNCATE doesn't affect the log file.

TRUNCATEONLYTRUNCATEONLY
Освобождает все свободное пространство в конце файла и возвращает его операционной системе.Releases all free space at the end of the file to the operating system. Не перемещает какие-либо страницы в файле.Doesn't move any pages inside the file. Файл данных сжимается только до последнего назначенного экстента.The data file shrinks only to the last assigned extent. Аргумент целевой_процент не учитывается, если указан аргумент TRUNCATEONLY.Ignores target_percent if specified with TRUNCATEONLY. Хранилище данных SQL Azure не поддерживает этот параметр.Azure SQL Data Warehouse doesn't support this option.

Аргумент TRUNCATEONLY оказывает влияние на файл журнала.TRUNCATEONLY affects the log file. Для усечения только файла данных используйте инструкцию DBCC SHRINKFILE.To truncate only the data file, use DBCC SHRINKFILE.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Подавляет все информационные сообщения со степенями серьезности от 0 до 10.Suppresses all informational messages that have severity levels from 0 through 10.

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

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

Имя столбцаColumn name ОписаниеDescription
DbIdDbId Идентификатор базы данных, файл которой компонент Компонент Database EngineDatabase Engine пытался сжать.Database identification number of the file the Компонент Database EngineDatabase Engine tried to shrink.
FileIdFileId Идентификатор файла, который компонент Компонент Database EngineDatabase Engine пытался сжать.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 value 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.

Примечание

Компонент Компонент Database EngineDatabase Engine не отображает строки для файлов, размер которых не был сокращен.The Компонент Database EngineDatabase Engine does not display rows for those files not shrunk.

RemarksRemarks

Примечание

Хранилище данных SQL Azure сейчас не поддерживает команду DBCC SHRINKDATABASE.Currently Azure SQL Data Warehouse does not support DBCC SHRINKDATABASE. Выполнение этой команды не рекомендуется, так как она интенсивно использует ввод-вывод и может привести к недоступности вашего хранилища данных.Running this command is not recommended as this is an i/o intensive operation and can take your data warehouse offline. Кроме того, она может потребовать дополнительных затрат на моментальные снимки хранилища данных.In addition, there will be costing implications to your data warehouse snapshots after running this command.

Чтобы сжать все файлы данных и журналов указанной базы данных, выполните команду DBCC SHRINKDATABASE.To shrink all data and log files for a specific database, execute the DBCC SHRINKDATABASE command. Чтобы сжать один файл данных или файл журнала в указанной базе данных, выполните команду DBCC SHRINKFILE.To shrink one data or log file at a time for a specific database, execute the DBCC SHRINKFILE command.

Чтобы просмотреть количество свободного (нераспределенного) пространства в базе данных, выполните процедуру sp_spaceused.To view the current amount of free (unallocated) space in the database, run sp_spaceused.

Операции DBCC SHRINKDATABASE могут быть остановлены на любом этапе процесса, при этом вся выполненная работа сохраняется.DBCC SHRINKDATABASE operations can be stopped at any point in the process, and any completed work is kept.

Размер базы данных нельзя сделать меньше минимального настроенного размера базы данных.The database can't be smaller than the configured minimum size of the database. Минимальный размер указывается при создании базы данных.You specify the minimum size when the database is originally created. Также минимальный размер может быть последним размером, явно установленным в операции изменения размера файла.Or, the minimum size can be the last size explicitly set by using a file size changing operation. Такие операции, как DBCC SHRINKFILE или ALTER DATABASE, — примеры операций, изменяющих размер файла.Operations like DBCC SHRINKFILE or ALTER DATABASE are examples of file-size changing operations.

Предположим, что база данных была создана с размером 10 МБ.Let's say a database is originally created with a size of 10 MB in size. Затем она увеличивается до 100 МБ.Then, it grows to 100 MB. Наименьший размер базы данных, до которого ее можно сжать, — 10 МБ, даже если все данные в базе данных будут удалены.The smallest the database can be reduced to is 10 MB, even if all the data in the database has been deleted.

При выполнении команды DBCC SHRINKDATABASE укажите параметр NOTRUNCATE или TRUNCATEONLY.Specify either the NOTRUNCATE option or the TRUNCATEONLY option when you run DBCC SHRINKDATABASE. Если этого не сделать, результат будет таким же, как если бы вы выполнили операцию DBCC SHRINKDATABASE с аргументом NOTRUNCATE и последующим запуском операции DBCC SHRINKDATABASE с аргументом TRUNCATEONLY.If you don't, the result is the same as if you run a DBCC SHRINKDATABASE operation with NOTRUNCATE followed by running a DBCC SHRINKDATABASE operation with TRUNCATEONLY.

База данных не обязана находиться в однопользовательском режиме.The shrunk database doesn't have to be in single user mode. Другие пользователи могут работать в базе данных (в том числе системной) при ее сжатии.Other users can be working in the database when it's shrunk, including system databases.

Невозможно сжать базу данных во время создания ее резервной копии.You can't shrink a database while the database is being backed up. И наоборот, невозможно создать резервную копию базы данных во время операции сжатия.Conversely, you can't back up a database while a shrink operation on the database is in process.

Работа команды DBCC SHRINKDATABASEHow DBCC SHRINKDATABASE Works

Инструкция DBCC SHRINKDATABASE сжимает файлы данных по одному, а файлы журнала так, как будто все они представляют один непрерывный пул журнала.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. Сжатие файлов всегда ведется с конца.Files are always shrunk from the end.

Предположим, имеется несколько файлов журнала, файл данных и база данных с именем mydb.Assume you have a couple of log files, a data file, and a database named mydb. Каждый файл данных и журнала имеет размер 10 МБ, а файл данных содержит 6 МБ данных.The data and log files are 10 MB each and the data file contains 6 MB of data. Компонент Компонент Database EngineDatabase Engine вычисляет целевой размер каждого файла.The Компонент Database EngineDatabase Engine calculates a target size for each file. Это размер, до которого файл должен быть сжат.This value is the size to which the file is to be shrunk. Если инструкция DBCC SHRINKDATABASE указана с аргументом целевой_процент, то компонент Компонент Database EngineDatabase Engine вычисляет целевой размер таким образом, чтобы в файле после сжатия был целевой_процент свободного пространства.When DBCC SHRINKDATABASE is specified with target_percent, the Компонент Database EngineDatabase Engine calculates target size to be the target_percent amount of space free in the file after shrinking.

Например, если указать целевой_процент со значением 25 для сжатия базы данных mydb, компонент Компонент Database EngineDatabase Engine рассчитает целевой размер для файла, равный 8 МБ (6 МБ данных и 2 МБ свободного пространства).For example, if you specify a target_percent of 25 for shrinking mydb, the Компонент Database EngineDatabase Engine calculates the target size for the data file to be 8 MB (6 MB of data plus 2 MB of free space). Поэтому компонент Компонент Database EngineDatabase Engine перемещает все данные из последних 2 МБ файла данных в любое свободное пространство в первых 8 МБ файла данных, а затем сжимает файл.As such, the Компонент Database EngineDatabase Engine moves any data from the data file's last 2 MB to any free space in the data file's first 8 MB and then shrinks the file.

Предположим, что файл данных базы данных mydb содержит 7 МБ данных.Assume the data file of mydb contains 7 MB of data. При задании значения 30 для аргумента целевой_процент можно сжать этот файл данных до 30 %.Specifying a target_percent of 30 allows for this data file to be shrunk to the free percentage of 30. Но задание значения 40 для целевой_процент не позволит сжать файл данных, так как Компонент Database EngineDatabase Engine не может уменьшить файл до размера, меньшего, чем занимают данные сейчас.However, specifying a target_percent of 40 doesn't shrink the data file because the Компонент Database EngineDatabase Engine won't shrink a file to a size smaller than the data currently occupies.

Данную ситуацию можно представить и другим способом: 40 процентов желаемого свободного пространства + 70 процентов от полного файла данных (7 МБ из 10 МБ) больше, чем 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. Любой целевой_процент больше 30 не приведет к сжатию файла данных.Any target_size greater than 30 won't shrink the data file. Сжатия не будет, поскольку сумма освобождаемого процента и текущего процента, занятого в файле данных, превышает 100 процентов.It won't shrink because the percentage free you want plus the current percentage that the data file occupies is over 100 percent.

Для файлов журнала Компонент Database EngineDatabase Engine вычисляет целевой размер всего журнала на основе аргумента целевой_процент.For log files, the Компонент Database EngineDatabase Engine uses target_percent to calculate the target size for the whole log. Вот почему целевой_процент — это объем свободного места в журнале после операции сжатия.That's why target_percent is the amount of free space in the log after the shrink operation. Целевой размер всего журнала затем пересчитывается в целевой размер каждого файла журнала.Target size for the whole log is then translated to a target size for each log file.

Инструкция DBCC SHRINKDATABASE пытается немедленно сжать каждый физический файл журнала до его целевого размера.DBCC SHRINKDATABASE tries to shrink each physical log file to its target size immediately. Предположим, что в виртуальных файлах журнала нет частей логического журнала за пределами целевого размера файла журнала.Let's say no part of the logical log stays in the virtual logs beyond the target size of the log file. Тогда файл будет успешно усечен, и инструкция DBCC SHRINKDATABASE завершится без сообщений.Then the file is successfully truncated and DBCC SHRINKDATABASE finishes without any messages. Однако если какая-то часть логического журнала хранится в виртуальных журналах за пределами заданного размера, то компонент Компонент Database EngineDatabase Engine освобождает как можно больше места, а затем выдает информационное сообщение.However, if part of the logical log stays 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 SHRINKDATABASE может быть использована для освобождения оставшегося пространства.After the actions are run, DBCC SHRINKDATABASE can be used to free the remaining space.

Файл журнала может быть сжат только до границы виртуального файла журнала.A log file can only be shrunk to a virtual log file boundary. Именно поэтому сжатие файла журнала до размера, меньшего, чем размер виртуального файла журнала, может оказаться невозможным.That's why shrinking a log file to a size smaller than the size of a virtual log file might not be possible. Это также может быть невозможно, даже если он не используется.It might not be possible even if it isn't being used. Размер виртуального файла журнала динамически выбирается компонентом Компонент Database EngineDatabase Engine при создании или расширении файлов журнала.The size of the virtual log file is chosen dynamically by the Компонент Database EngineDatabase Engine when log files are created or extended.

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

Обратите внимание на следующие сведения при планировании сжатия базы данных.Consider the following information when you plan to shrink a database:

  • Операция сжатия наиболее эффективна после выполнения другой операции.A shrink operation is most effective after an operation. Такая операция создает неиспользуемое пространство, например операция усечения или удаления таблицы.This operation creates unused space, such as a truncate table or a drop table operation.
  • Большинству баз данных требуется некоторое свободное пространство для выполнения обычных ежедневных операций.Most databases require some free space to be available for regular day-to-day operations. Можно сжать базу данных несколько раз и заметить, что она снова увеличивается в размерах.You might shrink a database repeatedly and notice that the database size grows again. Такой рост указывает, что сжатое пространство необходимо для выполнения обычных операций.This growth indicates that the shrunken space is required for regular operations. В таких случаях повторное сжатие базы данных бессмысленно.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 result is another reason not to repeatedly shrink the database.
  • Не следует устанавливать параметр базы данных AUTO_SHRINK равным ON без достаточных на то оснований.Unless you have a specific requirement, don't set the AUTO_SHRINK database option to ON.

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

Операции сжатия могут быть блокированы транзакцией, запущенной с уровнем изоляции, основанным на управлении версиями строк.It's possible to block shrink operations by a transaction that is running under a row versioning-based isolation level. Например, если выполняется масштабная операция удаления под уровнем изоляции с управлением версиями строк, когда запускается инструкция DBCC SHRINK DATABASE.For example, a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed. Когда это происходит, операция сжатия будет ожидать, пока завершится операция удаления, прежде чем приступить к сжатию файлов.When this situation happens, the shrink operation will wait for the delete operation to complete before it shrinks the files. При возникновении такого ожидания для операций DBCC SHRINKFILE и DBCC SHRINKDATABASE выводится информационное сообщение (5202 для SHRINKDATABASE и 5203 для SHRINKFILE).When the shrink operation waits, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE). Это сообщение выводится в журнал ошибок SQL ServerSQL Server каждые пять минут в течение первого часа, а затем каждый последующий час.This message prints to the SQL ServerSQL Server error log every five minutes in the first hour and then every upcoming hour. Например, журнал ошибок содержит следующее сообщение об ошибке: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.  

Эта ошибка означает, что транзакции моментальных снимков с отметками времени старше 109 заблокируют операцию сжатия.This error means snapshot transactions that have timestamps older than 109 will block the shrink operation. Такая транзакция — последняя транзакция, завершаемая операцией сжатия.That transaction is the last transaction that the shrink operation completed. Это также показывает, что столбцы transaction_sequence_num или first_snapshot_sequence_num в динамическом административном представлении sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) содержат значение 15.It also indicates the transaction_sequence_num or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamic management view contain a value of 15. Столбцы transaction_sequence_num или first_snapshot_sequence_num в представлении содержат меньшее число, чем последняя транзакция, выполненная операцией сжатия (109).The transaction_sequence_num or first_snapshot_sequence_num column in the view might contain a number that is less than the last transaction completed by a shrink operation (109). В этом случае операция сжатия будет ждать завершения этих транзакций.If so, the shrink operation will wait for those transactions to finish.

Разрешить эту проблему можно одним из следующих способов.To resolve the problem, 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.
  • Пока операция сжатия ожидает завершения блокирующей транзакции, ничего делать не нужно.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

A.A. Сжатие базы данных и определение количества свободного пространства в процентахShrinking a database and specifying a percentage of free space

В следующем примере уменьшается размер файлов данных и журнала в пользовательской базе данных UserDB с целью освободить 10 процентов свободного пространства в базе данных.The following example reduces 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. Усечение базы данныхTruncating a database

В следующем примере файлы данных и журнала в образце базы данных AdventureWorks сжимаются до последнего выделенного экстента.The following example shrinks the data and log files in the AdventureWorks sample database to the last assigned extent.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);  

См. также разделSee also

ALTER DATABASE (Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)DBCC SHRINKFILE (Transact-SQL)
Сжатие базы данныхShrink a Database